I left my job for another opportunity after working for 8.5 years. Since I had nothing left to do on my last day, I decided to get little creative and looked up online about how do write farewell email on Game of Thrones style. With little help from internet, I came up with the following email.
My lords and ladies,
It has been a great honor serving this most noble
software development house. I fought for this house with all my heart
for 8.5 years and we won some glorious battles together.
Songs will be sung for the next thousand years about our great victories over White Walkers(Bugs and Issues).
It’s a bittersweet ending for me to part ways and go North of the Wall now(NEW_COMPANY is north from OLD_COMPANY).
Whatever I do in the future, I now take this pledge
in the sights of Old Gods and the New, that I will forever cherish the
time I spent here and I hope you Lords and Ladies do the same.
A Guessing Game - to become Full Scope/Stack Developer
If you are wondering what would be a perfect project to practice your programming skills. You are in the right place!
It's a simple number guessing game. We start with a console app and migrate to a web app with lots of features.
Steps
1. Console App:
Read a number N from the console between a range (MIN, MAX). Your
code should then generate a random number CN between the same range(MIN,
MAX) and compare if the computer-generated random number CN and the
user entered number N matches.
If it matches, the user wins. If it doesn't match, the computer wins.
2. (Optional) Desktop app:
Create an interface to enter the MIN/ MAX number and the user guess.
MIN : [ Textbox ]
MAX: [ Textbox ]
User Guess [ Textbox ]
Also provide a button with label "Play" that generates the random number and displays a message in Label if the user won.
[ Play ]
Save the win/loss counts and winning/losing number in a text file
'stat.csv'. Display the average win/loss on UI when the user closes the
app.
Update the GUI or Console application to allow two users to play
with the computer. Both of the users can enter their guess and click
Play. The user that made the correct guess will win
GUI mockup:
User A's Guess [ Text Box ]
User B's Guess [ Text Box ]
[ PLAY ]
4. (Optional) Multi-Player Game - over socket connection:
Update the GUI application to allow several users to play
simultaneously. All the users will have a copy of the application and
can join the Game by running the application on their computer. The
first user to start the game can act as a Server.
5. Web Application:
Create a web application to play the same game in the browser. Reuse the previous code on the backend
Support single-player mode (play with the computer).
Add a sign-up page to register users. Update logic to allow only the
registered/logged-in users to play. Use ReCaptcha to prevent robot
making requests.
Block users from playing more than 1 hour. Lock them for 2 hours.
Multi-player: list online users and provide the ability to
request/accept to play with the user. Use WebSocket to listen for
updates in realtime.
Store the win/loss statistics into DB.
Generate a CSV report with stats about the winner, numbers, etc that you can download it from the web interface.
6. Fun Stuff
Schedule the 'winner stat' report to run every day and deliver it to your email address.
Setup a background job that sends an account deactivation email if the user is not logged-in in last 20 days
Setup a background job to deactivate user if the user is not logged-in in the last 30 days
Setup a public web API to expose information about the winners
Use caching to read user profile from the cache instead of reading from DB on every request
7. Operation:
Setup a Dockerfile script to run your app in docker
Setup static code analysis with local SonarQube instance. You can use docker to run SonarQube. Take care of SonarQube warnings.
Deploy your app in a cloud environment (eg Heroku, AWS, Azure)
Note:
Focus on readability, reusability throughout the development.
Myths and Facts About Programming - Stuff that I wish I knew in my early career
What's this?
A collection of common myths and facts (opinionated) about computer programming that I wish I knew in my early career.
Programming requires math
Neutral.
Only a few percentages of programmers deal with math problems in their careers.
Analytical skills help to break down the problem. Think of
programming as understanding the problem, breaking down into smaller
steps, and solving it. Similar to math right?
However, people who are bad at Math can be a good programmer. It
also depends on the type of role and type of problem they are trying to
solve.
Programming job is similar to a typist. It's all about typing code.
False
Programming(at entry level) is about:
reading documentation and requirements
documenting stuff
thinking how to write code
writing code
testing
debugging bugs
deploying
discuss with team member/management
The amount of time you spend typing code depends on your role and job
description. There will be days you won't be typing any code.
Majority of programming job requires maintaining an existing system
written over the years by several people. You will be required to add
features, customize, fix bugs, etc
You won't require a college degree to be a programmer
Everyone can learn and be a programmer within months
Programming is really hard
Neutral.
It depends on the individual, their learning/intellectual capability, and the type of programming role they learn/get into.
There will be certain things you can learn easily. But a college
degree will help to broaden your perspective and learn things quickly.
Programming is monotonous. Its like working in the assembly line at a factory
False
On certain days or working in the same role for a long time, you may get a feel of your job being monotonous.
But it's not like working in the assembly line. It requires lots of thinking and analysis.
Programming is not for girls
False
You need to keep reading new stuff throughout your career
Neutral
You don't "need to". But learning new stuff helps advance your career.
Also, it depends on the type of tool and technologies you are using.
Some tools/technology (eg: JS Frameworks) get deprecated every few
years. Sometimes
Learning a new paradigm, best practices, new architecture concepts is always useful.
Machine Learning and AI seems easy to learn.
I
don't have any knowledge of statistics/probability/modeling. However,
the ML/AI tutorial I found online is just 10 lines of code and it seems
easy.
False
It may seem easy to use ML/AI tools created by somebody else or
follow a cookbook. But you will need to understand many concepts to use
those tools when solving real problems.
Don't get intimidated by simple tutorials. Start by the basics and dig
into the tools.
Using long variable makes program slow. So I should program like this:
int a = read()
int b = 1000
if(a > 18 && b > 50)
println("Entry allowed")
False
With compiled languages, no. With interpreted languages, possibly but the difference would be negligible.
Always focus on readability. Compare the above code with the following:
int age = readMemberAge()
int balance = 1000
if(age > 18 && balance > 50)
println("Entry allowed")
I have to learn as many programming languages eg C, Python, Java, Ruby, Kotlin, Scala, Groovy, C#, Go to be a good programmer.
False
Think of programming language as natural language eg: Nepali, French, English, Japanese, and Chinese.
And the art of writing a novel or poem as the actual programming.
If you mastered five languages but do not have a skill of writing a (good) poem in either of those you are still not an artist.
Think of programming as art. Try to be an artist in at least one
language. Think of a hobby project and develop with paying attention to
code quality, performance, UI, features, etc.
Focus on learning programming rather than learning a language.
Programming is a skill that you can gain with just one language. If
you know how to do X in Y language then you can do it in Z language too
with little effort.
HackerRank, LeetCode will guarantee me a job
False
There's no doubt that the questions on those sites help you think critically and solve a problem.
Its a widely used screening method to filter our candidates these days.
Pet project(s) and your college projects will also help you land the first job.
Google, Amazon and Facebook are using X tool. It must be good so I should learn.
False
A lot of tools developed by tech-giants are being deprecated after a couple of years.
Looks for a tool/language/framework that's being used by a lot of companies for a long time.
X was developed by Google, Amazon, and Facebook so it must be good. I should learn and use it.
False
There's no guarantee that those tools MUST be good. Don't fall for advertisements
Review 100 job descriptions on Linkedin/Indeed etc and find yourself what's popular on the market
I must learn Angular, React, Vue and XYZ web framework to master my web development skills
False
It's better to start the web development without the frameworks so
that you understand how those frameworks are solving the problems of not
using those frameworks
You don't need to learn all of these, one would be enough. If you
started learning web development without using frameworks, switching
between frameworks would be easier.
I know X1 framework/library/tool. But the job vacancy says mentions X2(the alternative of X1). I should not apply for this job.
False
Test yourself if you know X1 framework/library/tool how long you will take to learn X2.
As long as you know the abstract concepts and have worked on at
least one pet/professional project on your own there's a high chance
that you can learn another framework/library/tool quickly. They all are
trying to solve a similar project but slightly different ways.
Also look for 'preferred' vs 'required' skills on job vacancies.
Everyone on social media hates language/framework X. X must be bad.
False
Don't fall for people's 'opinions'. People think languages/frameworks/tools as religion. They hate each other.
The best way to find out what to learn is to look at job vacancies. At least a hundred of them.
Language X does that in one line. So, it is the best language.
Neutral
DB.allRecords().read().toCsv("file.csv");
It's nice that they provided that functionality in one line out of
the box. But there is a great deal of code hidden behind the scene.
All languages support creating library modules to extend the
feature. Some languages are by nature too abstract/low level and it
requires developers to write libraries around it to make things simpler.