Reset phase at Encora Apprenticeship - Week 2

Polyglot programming

Posted by Ximena Sandoval on October 16, 2021 · 11 mins read

This post is part of a weekly assignment at Encora Apprentice and in this series, I’ll share my journey as a Software Engineer Apprentice. I hope these stories help and motivate others on their tech journey.

This week at Encora

This week at Encora was full of challenges, research, and resources. Today I’ll be sharing about the topics I got to learn and the problems I faced when working with tech skills.



Skills for life/profession

The genius programmer

There is this conception about the mythical genius programmer, the one that goes to their caves and comes back with a lot of code that is perfect and compiles on the first try. Truth to be told, there are no genius programmers out there, and even if there are, what the needs of a successful project are good programmers, people that don’t hide their code to their peers and acknowledges their mistakes and fixes them.

When we are developing we need to have that communication with our teammates and be able to share and ask for help when needed.

Navigating through an organization

We need to remember that companies are made of people and working as software engineers means not only working with the software but also knowing how to work with people (as we talked about before). When starting to work at an organization it’s important to:

  • Pursue responsibility. There is a difference between doing the bare minimum and doing things that help your team.

  • Question things. Have an open dialog, be part of decisions (when possible), and communicate in a proactive way.

  • Act like an adult. Don’t expect someone to always be telling you what and how to do something.

Of course, these tips apply especially if it is an ideal organization, but there are things we can do, like take action within the company, choose your battles, sneak ideas even if you don’t get the credit, be present, and many more. All of this information is part of this amazing presentation!

Social skills for geeks

Being able to communicate effectively is a fundamental skill when working as a software engineer, and Programming Well with Others talks about 4 main areas where social skills impact when working in a project:

  1. General personal behavior. As we talk about at the beginning, we should not take ourselves to caves and code without showing anyone what we are working with and getting feedback from it.

  2. Social dynamics of being in a team. Keep a nice environment around the project, be respectful and try to be a leader for the team, not a manager.

  3. Working with other (not just your team). Address behavior and work on fixing it. Understand that recognition is not the most important part of working on a team.

  4. How you interact with users. Build trust, listen to their feedback.

From novice to expert

There is a model that describes the stages between being a novice to being an expert, that was described in this talk and is as follows:

  1. Novice. Has no prior experience and needs to have short-term goals.

  2. Advanced beginner. Wants information fast but has trouble with troubleshooting.

  3. Competent. Seeks out for expect advice, starts being independent and taking decisions.

  4. Proficient. Wants to understand the larger concept. Starts asking why.

  5. Expert. Keeps looking for better methods and uses intuition, not reason.

Perfection and agile

Perfection Is An Unrealistic Goal is about agile development and how trying to make it perfect is not really possible. Agile development is not about being perfect, but rather be consistent. Projects are unpredictable and we can only do so much when giving estimations for them. That’s why we need to be flexible with the development.

It also mentions that we humans work in cycles, when learning something, when sleeping, etc, in the same fashion that agile iterations work. That’s why we should not do agile, but rather be agile.

In The Agile Mindset, it is mentioned that any ability, talent, or knowledge can be acquired as long as we practiced it, we get better at it. It is important to see failures as opportunities to improve, this is called the “Agile mindset”. It is important to set our goal to learn rather than look good, and be resilient to challenges.

I also got to learn about the conscious and unconscious mind Linda Rising interview, where they describe the unconscious mind as a powerful tool and how we can take advantage of it.

Rising also talks about stereotypes and as much as they come from evolution they can (and most of the time) be harmful.

Remix

Nowadays everything is a remix, a mix of existing ideas in combination with other smaller ideas. There are a lot of examples in the music industry. This series also describes the process of taking an existing idea and creating or building something out of it. The basic elements of creativity are copying, transform and combine are also introduced, and of course, we have to take into consideration fair use.



Skills for tech

The art of compression

I also got to learn about compression algorithms, starting with the basis of variable length codes and how to make them work you have to know the distribution of the symbols used for the data stream in order to assign the most frequent one the shortest code (otherwise this won’t work out pretty well). With this comes the construction of the symbol table, which maps each symbol to the corresponding code. This table also comes in handy when decoding the stream.

There are several compression algorithms used today, but the most popular ones are the LZ family, which are a series of algorithms that use tokenization of the data stream, a search buffer, and a look ahead buffer.

But as popular as this family of algorithms are, the trend is moving toward using Markov Chains (MC) algorithms for compression. The MC algorithms serve as the foundation for many big data, analytics algorithms used by big companies. With MC, we don’t encode symbols (states) but rather the transitions between them.

Don't forget about performance

When working with development (especially for mobile devices) we should take performance into consideration. One way to do this is with the performance tuning loop:

  1. Gather information about the application/site.

  2. Get insights about the information from the last step. Find where the problem is.

  3. Take action, solve the problem.

When applying this, we should take care of the following factor when working with a web-based application:

  • Network: Optimize the critical path. Improve the resolution of dependencies and check the weight of the assets you need.

  • Render: Reduce the number of paints on the page. Reduce the number of times the DOM needs to be recalculated.

  • Compute. Reduce JS execution time.

The best programming language

When starting to code it is very tempting to get married to the programming language that we are using since it is familiar, we know how to use it. In reality, we shouldn’t use just one language for all of our projects and should take into consideration some factors like portability, reliability, performance, productivity, etc when choosing a programming language to work with.

Shell and scripting

I also got to learn new cool commands/tools when working with bash, such as:

  • Globbing
    ls *.sh
  • Convert from one file format to another
    convert image.png image.jpg
  • Expand
    convert image.{png,jpg}
  • Loading scripts into memory
    source script.sh
And other cool tools like tree, broot, find, fd, etc.

Reversort and C#

One of the assignments of this week was to apply what we learned with the Best Programming Language and solve a problem using a language we had never used before, so I chose C#, and in this case, I solve the Reversort problem.

I learned a lot about C# syntax, the way the arrays are passed as parameters, and how to start a new C# project. I also find it helpful, in order to solve a problem in a new language, to:

  1. Understand the problem without a programming language first.

  2. Solve it using pseudo-code.

  3. Solve it using a programming language.



Recap

This week was full of time management, resources, and some coding challenges, but at the end of the day, it comes down to being ready to keep learning and not be discouraged by failure.

I believe all these new skills and knowledge will be very important for not only the following months but for a lot of professional experiences. I especially like all the lessons that can be applied both in professional environments and personal life.