Academy Program: Week 3
Hi and welcome back to my blog. This week has been a new challenge, each week has felt different in terms of keep putting me out of my comfort zone, but definitely each new period of time I learn a lot again and again, and thanks to these few weeks, I have discovered that I can learn faster than I used to imagine, this really motivates me to keep working hard for me and for others.
One thing that I would like to highlight is that my development has been possible not only by my effort but by working close to my partners, learning from each other, asking for help and helping others, collaboration has been key to improve.
This week was full of learning so let’s get to it.
“Talent wins games, but teamwork and intelligence win championships.” — Michael Jordan
“It is literally true that you can succeed best and quickest by helping others to succeed.” — Napolean Hill
The Technical Things
We began by learning a lot about Java programming and how to create a project about movie recommendations. First, I would like to talk about Maven, this is an automation tool for Java that helps developers simplifying the building and managing processes of our projects. Another thing I would like to introduce is Mahout, which is a framework for creating machine learning applications, it really simplifies our lives by using its different libraries. I used Maven for managing quickly the modules needed for creating the movie recommender application, and I used Mahout to treat the data I had about different reviews on movies, this information was extracted in a text format, and we downloaded it from a website. One piece of advice for anyone implementing things with Maven and Mahout, install IntelliJ, this IDE comes with all the things you need to work with these tools. Be aware that you might encounter errors due to dependencies, watch out for those.
Thanks to the activity, now in case I need to develop an application to recommend really anything to users (based on reviews) I will know how to implement it. One thing I really enjoy was learning how to access compressed files using Java, then accessing its contents (in this case a text file) to finally, loop through it and pull important information to then convert that data into a readable .CSV file, this format is necessary for using the Mahout library correctly, it requests this file type as an argument in one of the functions.
Moving on, in this project we also saw in action the libraries of JUnit, which is a unit testing framework for java, for doing tests to our applications. It was actually key for me to get to the right solutions knowing where exactly I was making mistakes. When using these tests it will pop up a message if your application doesn’t have the expected output after doing a Maven test.
Since I’m already talking about tests, I would like to introduce Test Driven Development, which is a software development process that in fact, applying it will rearrange our thinking and way of programming. Tests help us keep quality, costs, and features well managed, one of the most important things is that this will allow us to make our code reusable. In fact, I understood this process by remembering the following points:
- Think about what you want to do
- Think about how to test it
- Write a small test
- Write enough code to fail the test
- Run and watch the test fail
- Write just enough code to pass the test
- Run and watch all of the tests pass
- Refactor to remove duplication
- Run test again
- Repeat until you cannot find any more tests
Unit tests are low-level processes that focus on a small part of the software system, normally these tests should have a small scope, be done by the programmer, and be fast. As mentioned above, tests are written using specific tools or frameworks. JUnit actually belongs to the xunit family, formed by a bunch of unit testing frameworks.
There are two styles of applying tests, classical and mockist. What I learned is that the classical way is about using real objects if possible and double when it doesn’t make sense to use the real things.
On the other hand, mockist will always use a mock for objects with interesting behavior. Mocks are one of the 5 kinds of double used in test double, essentially mocks are pre-programmed objects with expectations that form a specification of calls they are expected to receive. Double is a generic name used for objects we create simulating real objects.
Be aware of the fact that these testing styles affect design decisions, and to choose one over the other we can analyze the advantages of using one over the other. For example, mockist looks at the implementation of the units it tests, and classical centers more on the inputs and outputs of the units. Essentially, it will be up to you to decide to use one, over the practice we will learn how can we develop faster while testing.
I already talked about Maven, but I would like to add something about these Java build tools for dependency management. These tools were created with the purpose of helping programmers manage dependencies and libraries without having to do some of those manually. Nevertheless, it is important how to manage them yourself so you can detect errors that the tools can’t. This is what I learned, to analyze dependencies, detect which versions to use, and identify when libraries and exceptions are needed.
Next, we learned about Vim and Git. Vim can be seen actually as a programming language because of all the different commands it has. Actually, Vim is a modal text editor, this means it runs in different modes depending on what you want to do. The types are as follows:
- Normal mode is designed for: Navigating around the file, reading things, going from file to file.
- Insert mode: Where you type in the text.
- Replace: Over-write text.
- Selection: Select contents, change them, copy them, and edit.
- Command-Line: Quit the text editor, save the change, navigate, open files.
I learned that Vim is a very powerful tool, at the beginning it can be hard to learn but once you get used to it, you will be able to improve your productivity when programming, developing, and creating projects.
It can come in handy to know Vim when you use Git. Git is a version control system that uses Vim for making commits, editing code among other things.
- Version control systems are tools that are used to keep track of changes to source or other collections of files or folders, and as the name implies, these tools help track the history of changes to some set of documents.
- They also facilitate collaboration, they are useful for working with a group of people on a software project.
- Version control software tracks changes to a folder and its contents in a series of snapshots so you can capture the entire state of a folder and everything inside. Each snapshot encapsulates the entire set of files and folders contained within some top-level directory.
- Maintain a bunch of metadata along with the actual changes to the content.
- This allows knowing who authored a particular change to a particular file or when was a particular change made (authors, commit timestamps)
- It is also useful when you are working on projects by yourself, to figure out why a particular change was made, you can look into old versions of code.
- Neat functionality: Who wrote a particular module in a software project or who edited a particular line in a particular software project (why, when, who).
- Git has become the facto standard for version control.
Learning Git takes time, it is necessary to work on it and follow the best practices. In software development collaboration is crucial and git enables developers to work together in projects. I have already begun to practice some basic commands by managing files in Github and my projects.
Lastly, I would like to add what I understood from a series of videos on Machine Learning from Google. I learned what tools exist to create ML projects like Scikit-learn and TensorFlow. I also understood the parts of the supervised learning recipe, from collecting data, to train a classifier to finally making predictions.
Understanding these concepts helped me to learn and remember a general idea of how ML works. From choosing features to utilize classifiers. Essentially features are the elements or characteristics we capture from the objects we want to classify. A classifier is a tool that helps us decide what label should we give to a certain object with certain given characteristics. Classifiers can be understood as functions that receive features as input and labels as output. There are a lot of types of classifiers (for instance, Decision Trees, K nearest neighborhood, and neural networks or support vector machine). It is possible to classify objects by extracting characteristics of them as features or we can also classify them using images (computer vision).
ML learning allows us to predict a lot of types of information, this will allow us to make the best business decisions for example, or we can even use computer vision to identify and classify objects in the space for projects like self-driving cars, medicine, and others.
A different perspective
I have talked about different technologies and tools that software developers need to know to be able to improve different aspects of their work. Below, I’m going to talk about the things that may change the way we think about our world and job.
We reviewed a video called Blue dot, this video talks about our position in the vast universe. Remembering this made me notice my responsibility to help others, my responsibility to work harder, and to invest my time in things that really sum up to my life.
In the world of programming, technologies are evolving quickly, according to Moores Law technology’s capacity is improving at a fast rate and these changes imply also that the way we use tools may be different over time, that’s why we need to allow our ideas change as technology changes. What I take from here and what I have been trying to do is, learning fast, be always curious, be open to new ways of thinking and take advantage of new tools.
In our lives, we might find it useful to create a principle that reminds us of the path that we want to take, something that guides our work and way of living. If there is something in the world that you think is wrong and you have a vision for a better world to be you can find your guiding principle and you can fight for a cause. I have been thinking about how can I apply this to my life, I think my principle would be “Give the best of you in everything you do, we have no time to give less, work close to others”, I’m still working on it.
Once we are aware of these previous things, it is also relevant to analyze our way of thinking about the problems and projects we face and get involved with. What I take from reviewing Moonshot Thinking and Inside Google X is that we should be resilient and expect a lot of things to go wrong while we try to do things and learn. This is, work in your projects even knowing that failure can happen, but if you’re not failing, you aren’t trying. Try to inspire other people and get uncomfortable working with hard things, work close to others and chase to solve big problems. Ask yourself, what would you do if you weren’t afraid?
I also learned some key elements to improve my presentations or talks, that can come in handy even when trying to communicate something generally. Essentially you should worry about making people think and feel.
To make them think: Contribute something useful and new, simplify the information, give it structure, associate things, and say what you want to say until it is clear.
To make them feel: Promote participation, congratulate participation, use images, change the rhythm of your voice and transmit the emotions you want your public to have.
I have already begun to implement this advice when trying to explain a concept to a person and I’m going to apply it in the construction of my next talk.
In addition, as we change our thoughts about our future and our identity, it is important to understand what habits are stopping you from progress and keep growing constantly. Make small investments in you, let the past go, take suggestions without judging, learn and help as much as possible, ask, thank, change and follow up. I’m applying this advice in my personal and professional life by hearing others without judging and taking their feedback to change for the better.
Finally, I would like to talk about something really interesting that actually made me realize how mysterious is the world and how exploration is part of us, from experimenting to learn about the things that intrigue us.
I’m talking about the quantum field, and I would like to begin with the quote “The most incomprehensible thing about the universe is that it is comprehensible”-Albert Einstein. This quote actually demonstrates the philosophical implications of the topic.
This is an important topic to know about, being that the development of technology to the next step depends on understanding quantum computers, learning the main properties of the quantum physics like superposition, entanglement, and manipulation will allow us to understand a little portion of what the quantum field implies. What I take from here is, there is a whole lot to discover about our world, what we think might be wrong, be willing to try to understand new things and enjoy the process.
Thanks for reading!