My Software Engineering Journey — Month 1
Having studied mechatronics, I didn’t know much about what software development was all about. When I graduated from university and began to work as a mechatronics engineer, I realized that it was not something that I really liked or really fulfilled me, I was simply not passionate about it. I did not see myself the rest of my life working on something related to mechatronics. I decided to take action. Programming was always something I enjoyed so I decided to transition to the world of Software Engineering. I am currently doing an Apprenticeship Program at Encora and these are some of the things I have learned in the first month of studying and mentoring.
Learning How to Learn
Life of a Software Engineer is a bit complicated. You have to be up to date with emerging technologies, in other words you always have to be learning. If you don’t you will be stuck and slowly become outdated. But have you ever wondered how you learn something? It’s something we’ve done naturally since kindergarten, almost like breathing. We do not give much importance to the process, we don’t think about the actions that make up the way we learn things. What if all your life you had been learning the wrong way? I will speak about some of the techniques I’ve learned to learn in a more efficient and faster way.
Do you know that we human have two thinking modes — the focus mode and the diffuse mode? When we are focusing on thinking or learning something with undivided attention, our brains are under the focus mode, meaning our brains are busying making new neural patterns or retrieving and strengthening the patterns that has already been built. This is the most well know mode, but what about the diffused mode?
The diffused mode refers to when your brain is relaxed, when you are forming connections without even knowing. Diffused mode can aid in learning things because connections can be formed more easily when your brain is relaxed. Think about a pinball machine, when there are many obstacles the ball bounces back and forth very quickly. Instead when having little obstacles the ball can travel for more time. That’s how diffused mode works, your brain is relaxed so the ideas or chunks of information can travel more freely making more connections.
When we want to learn something we usually want to do it all in one go. This can be done but it can be time consuming and difficult. On the other hand, this method supposes breaking what we want to learn into pieces or chunks, so we can learn simpler and smaller tasks first and thus make neural connections more efficient.
Has it happened to you that you find yourself stuck in a problem for a long time without knowing how to approach the solution? You may suffer from the Einstellung phenomenon. This happens when a thought pattern that you learned in the past prevents you from finding the solution to new ideas. Imagine a trail in the forest, maybe you are looking for a fruit in the forest but you cannot find it because you do not leave the marked trail.
Some people think they perform better under the stress of deadlines, but actually stress might weaken our ability to learn and memorize new things. When under this condition, our brain starts to loose the ability to make some of the connections between the chunks that you are trying to learn. It is best to take a little break to calm down and relax, stop worrying about the deadline and continue.
Procrastination is a huge problem for humans. Due to procrastination we tend to postpone many of the activities that we should be doing and we take much longer than we originally should. It is very dangerous not only because we don’t complete our work, but because it also makes us feel guilty about the wasted time. A very effective way to counteract procrastination is to apply a technique called Pomodoro, where you concentrate for 25 minutes followed by 5 minutes of rest. Thus, those long periods of an hour checking the cell-phone or watching videos on YouTube can be avoided.
How Computers Work
Computers have become an integral part of our lives. They are the backbone of almost every business in the world, in fact some of the most successful companies are centered entirely in computer hardware or software. But have you ever wondered, how does a computer work? This book aims to unravel the inner workings of the biggest invention of human kind.
What is Code?
Human beings developed language to be able to transmit information and ideas. Speech and writing are very effective ways of doing this, but what if we needed to communicate over a long distance? Maybe a more compressed way of doing this exchange could be beneficial. From this problem arises the idea of coding the letters of the alphabet in different ways to transmit ideas through light or sound using Morse code, or even embossing a sheet using Braille code. This same principle of compressing can be used in numbers using the binary system, where only the numerals 1 and 0 exist, however they can be used to represent any number in the decimal system.
Electrons and Electricity
Every atom is made up of 3 parts: Neutrons, Protons and Electrons. Understanding how this last item works is what led us to discover electricity. Electrons like to move around the atom, and electricity is just the flow of electrons running through a conductor, usually in the form of a wire, this flow is called electric current. A conductor are materials that permit electrons to flow freely from particle to particle. In contrast, insulators are materials that impede this free flow of electrons. But what if we could have the best of both worlds? A semiconductor is a material that in some cases will conduct electricity but not in others. Scientists discovered that as some semiconductor materials were heated, they conducted electricity better. This led to the development of transistors using Silicon.
Logic Gates and Memory
The main building block of computer logic are AND, OR and NOT logic gates. These later evolved into XOR, NANDS and at some point jumped over a new category: memory. The ability to retain information and stored was achieved the first time when the flip-flop was invented. Flip flops and latches are the fundamental building blocks of digital electronic systems used in computers, communications and many other types of systems. It is the basic storage element in sequential logic. After improving in the design and clustering many flip flops together to store many bits of information, the RAM or Random Access Memory was created.
Digital Computers and Instructions
RAM memory could perform arithmetical operations such as addition and subtraction of binary numbers, it also could store and modify elements in memory. When transistors appeared RAM memory saw a huge increase in its capacity, and so many more operations were included in the RAM. These instructions were written in assembly language, which consists of an assembler or low-level programming language that communicates directly with the computer’s hardware. Learning to code and assemble instructions in this language was very hard and time consuming, worst it could not be translated to all computers because of the processor. This led to the rise of what is now called a high-level programming language. This type of instructions were easier to write and code, and more importantly, could be used in every computer. A compiler was needed to compile the instructions and translate them into machine code the computer could understand.
In the early days computers weren’t interactive at all, switches and cables were used, then it transitioned to punched cards as input devices and printed results on paper as output. That was it. No screen was involved. It was until the 70s that a screen was first introduced to serve as an output device displaying ASCII characters. It was still difficult to navigate the computer’s content, the user needed to know computer commands and a programming language. Almost a decade later Microsoft and Apple released Windows and Mactintosh System 1 respectively. This was the first attempt to make a friendly GUI or Graphical User Interface, where users didn’t need to know how to code to use the computer. This changed everything and truly positioned the computer as a home item everybody could own.
Be Passionate About What You Do
Nothing matters if you don’t have passion. What this means is that, if you don’t care people will eventually will start to notice. You will not enjoy working, neither other will enjoy working with you. So it doesn’t matter if it is not Software Engineering, start learning and working on something that you are really passionate about. You should treat your career like if it was a product.
Choose your market.
Choose carefully the technology that you will develop in. It could be a technology in its last days, a new and flashy technology that is in its infancy, or even better a mix of both. Make sure to take into account the supply and demand of these technologies, there could be a million Java jobs out there with a decent salary and a few Python jobs that pay very good.
Make sure to be the worst. Being the worst in your team gives you the most room to grow! You can learn through osmosis and being exposed to great coders. Take risks when choosing a job!
Invest in your product.
Learn the other side of the business. Dealing with clients can be exhausting because they can sometimes don’t understand the technical aspects of the project, but do you understand the business aspects of the project? Try to learn about this to facilitate the interaction and become a pro.
Finding a mentor is key. Look for a mentor within your company, if you can’t find someone you can look online or with friends. Your mentor should be more experienced and have the respect of a significant network of people.
Practice as much as you can! Practice makes perfect, and when you are coding for work you aren’t really practicing but performing. You should take some time to review essential CS concepts and practice problems.
Have an accomplishment to report every day. This will put you in an excellent state of mind. You will be thrilled about your productivity and because you are supposed to deliver a hit a day you can’t afford to slack two weeks developing something. Constantly ask yourself “Was I worth it today?”
Learn to Fail! Most of us like to think of ourselves as geniuses, in reality there are no geniuses and we can’t do everything on our own. Failing is not the end of the world, if you have a good leader or management their will encourage your failure because that’s when you can learn the most. Teamwork is an important part because they can support you through this process.
Learn to say NO. Be honest with yourself if you can’t take on a new project because you have other commitments or simply because you lack the skills to develop the project. Also learn to work just 8 hours. The 8 hour burn should be more than enough for the day, you have a personal life to live and enjoy!
Take a tour guide approach to your projects. Don’t because the old grumpy code person everybody is afraid to talk to. Learn how to communicate and become a person that everyone can talk to. Also learn how to write! Being able to communicate your ideas onto paper is key to making documentation and other important management documents..
Make accomplishments in business language. This means to make accomplishments that will have a business benefit for the company, you could work for years without a look, but upper management will sure notice you if you make the company save some money.
Be an Open Source Contributor. Many people use open source projects like scikit-learn, pandas, rails etc… There are few who develop them. Contributing to an open source project can demonstrate not only technical skill, but also leadership and teamwork abilities!
Maintaining Your Edge
Try to keep up to date your skills and be aware of the technology news. This will help you catch the next wave and always be on the edge.
Ask for people to make a review on you. It could be people at work or maybe even your friends. People change every day, maybe you enjoy your job today but in five or ten years it will not be a fit for you.
Make a list of improvements you can do on yourself. For each item think about “What can I do today to become better?” Tomorrow ask the same question and do it all over again. Spend a few minutes of the morning doing this. Self-reflection can help you improve in many ways.
Collaboration and Teamwork
Collaboration is the action of working with one or more people who have different skill sets to produce something, such as finishing a project, developing a shared idea or completing a task. I learned the hard way about how important communication is in a professional environment. This is not school, it is not about dividing the work and seeing each other until the due date, there must be constant communication with the team about the progress of the tasks. There will be cases where someone on the team is behind with a task or is simply very difficult for them, that’s where the team comes in to provide support and get all the work done.
Big O, Data Structures and Algorithms
There are two main things that we talk about when we say this is good code. Good code can be described in two points: One is Readability, is your code just generally clean. Can others understand your code? The other one is Scalability. But… what does that even mean?
Big O Notation is what allows us to measure this idea of scalable. It is the language we use for talking about how long an algorithm takes to run. We can compare 2 different solutions and say which one is better than the other in terms of scale, regardless of our computer differences. When we talk about Big O and scalability of code, we simply mean when we grow bigger and bigger with our input, how much does the algorithm or function slow down? How much more operations does our program need to perform?
When we write code, we want to write code that can scale so that we don’t have to constantly go back and fix things. And that’s why Big O is so important it means thinking long term, thinking big about your code and what could happen in the future.
There are a ton of Data Structures, and each of them have different Big O costs associated with their methods. one data structure might be better than others for a certain task. Some have really good search Big O. Some have insertion, some have deletion. Data structures are simply ways to store data and algorithms are simply functions or ways to use data structures to write our programs. Great programmers have this knowledge where they pick the right data structure, the right algorithms to write good programs.
Testing is essential because we all make mistakes. Some of those mistakes are not important, but some are expensive or even break something in the system. We have to test everything that we produce because things can go wrong; humans can make mistakes at any time.
You can verify all the aspects of the software in software testing, such as checking the basic functionalities as well as testing a system for unexpected conditions. Unexpected conditions can be from an incorrect data type or maybe an incorrect input from the user. Therefore, testing makes sure that the system can handle these situations very well. Thus, if we find an error in advance, we have the option to correct them. It can prevent complaints once the software or application has reached customers. Software tests help developers find errors and scenarios to reproduce the error, which in turn helps them to fix it quickly.
Link to a mental map:
Some links to the resources:
Code: The Hidden Language of Computer Hardware and Software
Amazon.com: Code: The Hidden Language of Computer Hardware and Software eBook : Charles, Petzold: Tienda Kindle
The Passionate Programmer: Creating a Remarkable Career in Software Development (Pragmatic Life)
Amazon.com: The Passionate Programmer: Creating a Remarkable Career in Software Development (Pragmatic Life) eBook …
Learning How to Learn: Powerful mental tools to help you master tough subjects
3,026,983 already enrolled This course gives you easy access to the invaluable learning techniques used by experts in…
I will keep you updated on the things I learn as I progress through the program. Feel free to message me about any doubts!