Nowadays, we are going through really exciting times as the whole world is embracing a global technological revolution (maybe even an evolution?). Everybody wants in on the action and unlike other scientific disciplines Computer Science seems to be one of the very few fields with low barriers to entry. At least that’s how it’s being marketed. Is this the reality though?
To answer that question I have to shed the light on a few nuances that enthusiasts / students seem to be missing when they start their journeys with software development.
Computer Scientist vs Software Engineer
Quite so often, Computer Scientist, Software Engineer, Software Developer, Coder, and Programmer are used as synonyms, disregarding the differences in the skillsets of the holders of each title. Even the ICT community is in a constant debate over the merits underlying each title.
Let’s clarify this a little bit. What is Computer Science?
“Computer Scientists are first and foremost scientists. They possess a deep knowledge of the theoretical foundations in mathematics and information science and can develop complex algorithms and advance scientific research. They operate in a world of rigorous analyses, clearly defined concepts and proven facts.” 
Ok, what is Software Engineering then?
“Software engineering is very much focused around designing, developing and documenting beautiful, complete, user-friendly software.” — David Budden in Degrees Demystified
The pursuit of Computer Science as a field of study does not prepare you to be a good Software Engineer (we will use this term to encompass Programmers, Software Developers and Coders). Simply because the skillsets developed in a Computer Science program are completely different from the ones needed by a Software Engineer!
Computer Science is a branch of applied Mathematics and is very much focused on studying Discrete Mathematics, Algorithms, Data Structures, Database Theory, Programming Languages and Compiler Designs, Computer Architecture etc. Areas that are heavily theoretical and impractical (not in the sense of uselessness) without extra effort from the students to connect this foundational knowledge to the real world.
Software Engineers on the other hand will study and use much of the theoretical knowledge of Computer Science to design working solutions for real world problems. These solutions being user-friendly, efficient and effective desktop, mobile, web, enterprise or infrastructural applications (to name a few). They will harness the power of theory and figure out ways of applying it to the real world.
The following example should provide more clarity on what is described above:
Assume Company X has around 1500 employees who are distributed to 3 shifts per day. The schedule for these employees is drafted every week. Yet, scheduling this large amount of people is taking days to complete. Company X figured that since technology has advanced so much, why can’t a computer do the work? Great reasoning! Company X’s management has approved the automation project and now is the time to find someone who can do the job. Who do you think they should hire?
For the purposes of our example, we’re going to assume that there are no products available in the market that Company X can purchase off the shelf.
A Computer Scientist (or a team) is ideal for this job. Their work will be confined to modeling this problem and designing an efficient algorithm that will process the 1500 employees data and output a schedule (roster) that is “fair” for all. They will do all the math necessary to prove the correctness and fairness of the algorithm and even calculate its running time and memory consumption within a specific set of constraints. The work of these scientists will be limited to the publication of a paper, and a small proof of concept which could be as simple as an application that takes information from a text file and outputs another.
This proof of concept is definitely not user-friendly or useable by the scheduling officers of Company X. They can’t even figure out how to run the program, and managing text files was a nightmare. They even have a lot of missing features that the proof of concepts does not cater for!
Now comes the role of Software Engineers who will take this publication and proof of concept and build a full-fledged enterprise application. This enterprise application will allow scheduling officers to login with credentials, generate a schedule after specifying the constraints, receive an attendance report, get approvals from management on vacation days to include in the schedule and even generate payroll data all done with a few clicks in a fancy UI. They will even develop documentation for how the system should be used, how to install it, configure it and maintain it.
While the real world is definitely more complex, the example above should have at least cleared some of the ambiguity.
Why then, do aspiring Software Engineers study Computer Science?
There are many answers for this question, the ones I know of are:
- Lack of awareness on the differences between the fields
- Software Engineering is not a major available in all Universities around the world
Studying Software Engineering does not absolve students from having to understand the theory of Computer Science. In fact, great Software Engineers possess a deep understanding of Algorithms Design and Complexity Analysis, Data Structures and Abstract Data Types, Operating Systems, Programming Languages Theory and Paradigms etc. They will use this knowledge as the foundation for whatever they design!
Can a Civil Engineer construct a bridge without understanding Newton’s laws, gravitation, conservation of energy, principles of stress and strain etc.?
I see, so what does this have to do with Web Development again?
This statement will definitely spark a lot of debate, however, in my opinion Web Development is Software Engineering. Web Developers are Software Engineers who specialize in designing and building Web Applications.
As such, if you aspire to become a Professional Web Developer you will need to acquire the necessary Software Engineering skills.
How? That’s up to you. There are different means to that end:
- Search for an online Software Engineering curriculum and study all the topics mentioned in it
- Enroll in a University offering a degree in Software Engineering with an emphasis on the Web
- Enroll in a University offering a degree in Computer Science and put in additional effort to experiment and learn the practical tools needed for the job that are not covered by the program
- Study Computer Science (University or online) then enroll at SE Factory to acquire the missing skills
There are no constraints on the how. It all depends on your levels of self-discipline and your desire to ramp up knowledge in the field.
But do not be fooled, this is not a few hours, weeks, or months journey. This will cost you an estimated minimum of 1 to 2 years of full-time learning.
What if I have majored in a different field?
There are no easy answers for this question and there are no shortcuts. If you wish to become a professional i.e. build a career in the field, get paid adequately for the work you do, and eliminate the upper constraints to your growth potential you have to put in the hours!
Good for you! However, Software Engineering is far more involved than learning a markup, styling and a scripting language.
We at SE Factory cannot effectively teach what the HTTP Protocol is without our students having an understanding of Networking concepts, we cannot discuss practical Databases Design if students are not familiar with Database Theory, we cannot effectively tackle Cloud Architecture, Virtualization and Infrastructure design if students have not studied Operating Systems; and the list goes on...
We are working with our students to help them augment and upgrade their theoretical knowledge and learn how to apply it in solving real world problems. We are bridging the gap between their Computer Science training and Software Engineering skill requirements (which is what the market is currently in need of).
No short-term program can prepare you to become a Professional Software Engineer in N number of weeks if you don’t have the background. That’s impossible. At best, you will develop familiarity with the different tools allowing you to execute small scale, limited projects and will expose you to the concepts you might be lacking in. The next step will be to ramp up your knowledge in the theoretical areas you have a gap in. Only after attaining that goal will you transcend from someone who executes/copies designs to someone who can design custom solutions.
If not a professional, what does that make me?
An enthusiast. This is in no way a derogatory term. The pursuit of knowledge is noble whichever form it takes.
I personally dabbled with electronics and have reached a stage where I can assemble basic circuitry to execute some very simple functionality. Does that make me an Embedded Systems or an Electronics Engineer? Surely not.
Why should we expect things to be any different in the field of Software Engineering?
That said, nothing prevented me from making money for solving someone else’s problem and it definitely does not prevent you from continuing your education and furthering your knowledge!
There is no doubt that we live in a highly pragmatic era. Much of the cultural dogma associated with formal education is being shattered with success stories of people who have achieved so much with self-education and other unorthodox means.
The purpose of this post is to raise your awareness on the categorical differences between fields of study and to shatter the misconception that years of experience and knowledge can be condensed in weeks or hours.
If anything, Software Development like any other skill requires practice, the more effort and time you invest in it the better you will become. However, guided practice is necessary and this guidance comes from the study of the underlying theory.
Let’s take learning the guitar as an example. There’s nothing preventing you from picking up the instrument and practicing the basic techniques. In 2 or 3 months of continuous daily practice and with the help of the huge number of Youtube videos out there you can play 2 or 3 songs.
Despite that, can you:
- Compose an original piece and have the ability to communicate it to a band?
- Can you play an intricate melodic solo that will spice up your jam?
- Do you have the ability to arrange, record, produce and release the song for public consumption at a studio quality?
- Can you perform at a 45 minute gig?
Unless you are a musical prodigy with superhuman fingers dexterity and impeccable muscle memory, these goals are largely unattainable within a 3 months period. Yet, with consistent daily practice, knowledge of musical theory, the help of a mentor / tutor the above is definitely achievable, to some, within 2 to 3 years. Right about then, the sky is the limit for what you can achieve! You have simply granted yourself choice.
The same applies to this domain. Patience is the key.
Now that I have prepared you mentally and realistically for the challenge ahead, I will be publishing a series of posts in the very near future providing you with guidelines and resources to dig in knee deep into the beautiful field of Software Engineering and Computer Science.
Thank you Ali Koubeissi and Abed Halawi for reading drafts of this post.
 “Don’t confuse Computer Science with Software Engineering” https://code.berlin/en/blog/computer-science-software-engineering/