A few weeks ago I got a LinkedIn connection request from a fellow Indonesian software engineer. Then a few days later he asked me several questions about his software engineering career, in this article, we will share his questions on his software engineering journey and how he can do better.
Without further ado, let’s get started. Here’s his first question.
So now I build a software engineering portfolio. But I feel stuck where to start. I am a little confused about the skills that really need to be mastered, whether the engineering principles or the technology?
There are a few points I want to highlight here, there are
- engineering portfolio
- skills need to mastered
- engineering principles
Let’s discuss one by one.
If we discuss an engineering portfolio, I think the first question is why we want to build it? Is it only for the sake of a portfolio or we want to land our dream job using that portfolio? Or we just want to have a collection of portfolios that we can share with others in the future.
If you only want to have a portfolio only for the sake of a portfolio I think this is not a good place to start because you don’t have a good reason to start. If you are in this situation, a better first step would be setting up goals and expectations about why you want to build it in the first place?
It is a different story if you have a specific goal like want to be a mobile developer or data scientist, now you have more specific goals. The problem with software engineering is, now there are a lot of diverse subjects in software engineering, ranging from
- Software Engineer
- Frontend Engineer
- Backend Engineer
- Mobile Developer
- System Engineer
- Data Scientist
- Data Engineer
- Software Engineer in Test
- Blockchain Developer
- Machine Learning Engineer
- you name it.
Since there are lots of variations if you have specific goals like being a good mobile developer you can start building a system to demonstrate your skill in this area. Or if you just started, you can build your portfolio by having all your code online, whether it is public or private, at least put your code in GitHub or GitLab, so you can show it to other people and pitch yourself if someone asking you about a specific area in the mobile development.
I love to document all my code in online Git repositories as well so that I can search easily if I want to solve a similar problem. So, if you just getting started or testing out new technologies, just put it on the internet, preferably public so that people can see what you have done.
Lastly, if you only want to document your code or work you have done online, I think you can start by having clear documentation or
README.md in every public project you write, that way people can understand that you are very organized and people can learn more about your project easily by reading the documentation.
Skills need to mastered
I want to emphasize things that I always talk about in my blog that challenges in every organization usually varies from one organization to another. People are complex and their interactions can create a more complex system. Then if we recall Conway’s Law:
“Any organization that designs a system (defined more broadly here than just information systems) will inevitably produce a design whose structure is a copy of the organization’s communication structure.”
The system you build will reflect how your organization communicates and interact. Thus every organization has its own unique challenge and context. So things that big companies like Google running planet-scale system are most-likely different from companies in Indonesia trying to achieve product-market-fit in their product category.
Additionally, the tech-landscape in Indonesia is a bit different from (let say) US-market. Tech-landscape in Indonesia is less mature since we only started in the e-commerce boom (2010–2012) compare to let say India or the US which already started long before us. Although the software system is already being made prior to that era, the adoption rate is just starting to be big in recent years here.
So, there’s a bit of difference in priorities. Startup in Indonesia needs software developer and engineer to build feature and put less priority in scalability, although some good companies did in the early days, again time-to-market is more priorities here in Indonesia and engineer in Indonesia is mostly users of technologies like React (in the frontend), Node.js (in the backend), Rails (full-stack), and many other technologies. We are not in the stage where lots of technologies are being built here in Indonesia, since the priority is less different.
I also a hiring manager myself in various companies I worked for in the past and present, and the quality of software engineers is quite low here. I talked with engineers who already 5 years in the industry but they only do the same thing again and again. Moreover, they don’t know how to build systems and how the system interacts with each other to create a larger system. When discussing system design they always think about the CRUD system using REST API. No variations and out-of-the-box thinking.
However, I believe in the next few years tech landscape in Indonesia will be so much different, there will be more unicorns, more big companies going digital and there will be more emphasis on scalability and performance and not only building features. So fundamentals like data structure and algorithms, problem-solving, critical thinking, and deep understanding of computer systems will be the key to support 250+ million Indonesians.
I want to start this section with a nice TEDx talk where he emphasizes how the majority of people are always wrong and how we can think outside of the box. Here’s a quote from the video.
We live in a world where the questions might be the same, the answers have changed. In other words, what has got you here, will no longer get you there.
And yes, someday us the same engineer who works in this era might be older and facing different challenges in the future. The questions are the same (building software system), but the answer has changed (more challenges like scalability, performance, backward-compatibility, etc).
So yes I agree to strengthen our engineering principles and knowledge is so important. Here’s a few things I can recall
- Deep understanding of how the system is being built and interact with each other.
- Understanding of communication protocol and an understanding that protocol is just things that people made and in the future, we will build our own protocol if needed.
- Deep understanding of Data Structure and Algorithm. Data Structure is important because if we build our data structure right, we could develop systems in a more natural and intuitive, and also will save us from a lot of problem in the future. Then algorithm came in handy, if the data structure is right we can leverage the algorithm to do computation way faster even with the same machine specs.
Here are some resource you might find useful
- and many more.
Also, he adds a follow-up question.
But I am a bit confused about the job requirements of the developer, I think the difference is only whether I have/haven’t used the technology mentioned. So, in my opinion, as a developer, which one is better between being familiar with a lot of technology or just exploring a few technologies?
For the technologies part, I think it has equal importance as engineering principles in your tech career. Because you need to implement the concept in your head and turned it into a code.
Then if you asked me should I learn only one or should I learn various technologies, I think we should do both. Master one technology as your daily-driver and learn another one as a way to enrich your thinking and avoid being trapped in tunnel vision. It helps us to think outside the box.