Software Engineering — Art or Science? My first blog post!

Shlomi M
6 min readOct 4, 2020

Introduction and goals

A bit about myself

My name is Shlomi. I am 32 years and I consider myself a very enthusiastic software engineer. This post is my very first one, and I am excited to have you reading it!

I feel most comfortable writing code in Java \ Python but I have some extra knowledge with some of other programming languages, computer layers, open source tools and system-related stuff (Linux, Networking, DevOps etc)

I still have a lot to learn (Well.. there always is more) and will do so as I hope to get this blog more professional and useful for my readers.

How did I get into software engineering?

In my youth, I used to hack my way understanding stuff, back when google didn’t exist, playing with static web sites (pure HTML & CSS) — Later learning the DHTML standardized by ECMA by what is known ECMAScript or simply JavaScript today.

As I’ve grown — so did tech, and this is where I knew I had to transform my hobby into a professional career and further enhance my knowledge, especially Computer Science Fundamentals, which I truly believe are basics for excelling in the realm of software engineering.

Blog Goals

In my blog, I will mostly write about anything related to programming, software engineering and tech. However, I will also incorporate some of my life experiences, my views and some tips as I believe diversity is a positive thing.

I know this post (and probably next ones) might a bit messy and I hope to learn from mistakes, take your feedback and iterate for better and more professional content and writing — style.

I hope to put some knowledge and interest in your mind.

That said, let’s jump into some engineering stuff!

Software Engineering —Rough Overview

Software engineering comprises of multiple different topics, and I often think of software engineering as an art — composing it’s various topics and knowledge into a working program, product, or simply a software.

Let’s examine some basic aspects of software engineering.

Programming Languages

From Wikipedia —A programming language is a vocabulary and set of grammatical rules for instructing a computer or computing device to perform specific tasks.”

— This is essentially how we express our ideas, desires and tie things up, a tool to craft our art.

Knowing your programming language is very important, what is it capable of? what are it’s advantage over other programming languages, limitations or bottlenecks? What kind of project (Embedded, Web, core Back-end, Desktop) would it best satisfy?

Knowing these aspects of your programming languages is really a must in order to produce good software and making key decisions when choosing your stack for a specific project or software you’re about to develop.

System Design

This is the process of defining the components of a larger, broad system, be a it a product, a website, a set of interfaces, architecture or just a module inside a specific component meant to satisfy a set of requirements that the designated system shall serve. Such Design can be expressed using even very Diagrams as shown below.
Although mostly, for big complex systems creating such diagram is a tough process requiring lots of knowledge and experience and contains lots of considerations, constrains, debates, errors, and many iterations to have a full “final” sketch. Yet, the implementation of a given diagram isn’t guaranteed to be as trivial or granted, and may expose many issues with the diagram itself.

(The above example is a rather simple UML Diagram containing the description of an Object Oriented Hierarchy following the Strategy design pattern — Implementation can be easily done using any OOP languages such as Java, C++)

Computer Science

Strong knowledge of Computer Science fundamentals can turn any average or good programmer to a professional skillful engineer that can apply CS basics in his way of thinking, either if programming or designing anything. CS knowledge in a nutshell, will be expressed by deep understanding of mathematics, algorithms, data structures, statistics, general thoughts and analytical process of problem solving which in turn will contribute to the code design, it’s performance and it’s modulariy.
This knowledge can turn any code to a code that runs faster, is error-free (no memory leaks, no forgotten edge cases, good utilization of hardware ) and is easier to read, extend, debug. Nowadays, development time is really a key factor when assessing or building a project, thus having strong CS funds can ease the development cycle and by that save lots of money and headaches.

System and tools

Know your stuff — having a good grasp of the various open source tools, the trade-offs among them (i.e ‘Rabbit VS Kafka’) is essential for making critical choices when designing or programming software.
Knowledge of Linux, Windows, Networking is a big bonus to help you get along when or where exactly your code runs now, which in turn can help debug, asses problems, find bottlenecks and actually avoid many of such.

Conclusion

This is where the ‘art’ word comes into play, Software engineering is essentially the process of defining requirements, designing a system, developing the system, testing and finally deploying and monitoring our system where in any stage of the process we might re-iterate that stage or an earlier one as we might encounter errors, anomalies and other problems that are only exposed at later stages (For example, a test for a specific function or API that reveals a bug in a specific piece of code, which in turn might point to an error with the design, which in turn might point to an error with the definition of the requirements..)

If we deliver a set of requirements to a few groups of engineers, we will most likely see different design, different components, different code (in different languages), Thus, composing the knowledge of the mentioned skills above will yield us many different solutions for the same problem. Creating the solutions requires thinking, investigation, re-iteration and hard work, but the real art is starts from day one: Reading the requirements, choosing your tools, your stack, your programming languages. Every decision shall be taken with careful consideration where we examine the benefits and the downsides, and how do we make up to these.

The Car Analogy

Imagine, for example, the exact same car, that is, same view and technical capabilities, produced by different independent teams of engineers. Obviously, we will see totally different designs (mechanics, hardware and software) — imagine how many different choices had been taken, how many debates, think of the different knowledge that has been applied for each chosen design, when essentially producing the exact same result for the client (the driver, in this scenario).

Eventually the car creators start with a vision, and use tools to bring that vision to life. They choose their tool stack, scientific and engineering principals and apply it when building that car. Can we say thus that the application of the various knowledge is an artistic, individual creation?

My personal words

First and foremost — thanks for reading my first blog post.
I know I have a lot to learn and will try to do better, either in writing-style, the content itself, my technical knowledge, etc.

I will truly appreciate your feedback regarding any matter and I hope to learn and provide you with good, interesting content. I will be glad to take requests in the realm of programming and software engineering, and do my best to provide with good, interesting stuff for you to read as I learn in the process.

So..What’s next?

In the next articles, I will try to dive in into more specific technical stuff, be it a testing framework or asynchronous coding in java / python, differences and use-cases of different programming languages. I will basically pick stuff which I currently feel having solid knowledge of, and topics that I am being asked by colleagues and friends often. I will also write some non-technical posts such as “What are some must-have tools for any software engineer to know today and why” ? (Hint: an article though of writing soon).

I’ll be glad to take any requests hoping I have the knowledge to cover that, and If I don’t, I promise to try hard and learn it so that I can produce a valuable article.

Also, as I mentioned above, I will incorporate some of my own personal views of life, my own life experiences, health etc (however, in a lower rate at least for the time being) as I keep evolving as a person and an engineer.

Can’t wait to have you reading my next article!

--

--

Shlomi M

Passionate software engineer, having first steps towards well-written blog posts with useful content and fun writing — style. Will appreciate your feedback!