1 | #+TITLE: Tech stacks for earning money as web developer
|
---|
2 | #+DATE: <2022-07-27 Ср>
|
---|
3 | #+LANGUAGE: en
|
---|
4 |
|
---|
5 | * Tech stacks for earning money as web developer
|
---|
6 | #+BEGIN_abstract
|
---|
7 | In this article I'm going to categorize languages, frameworks, libraries
|
---|
8 | and software by a criteria of ease of starting to earn money. It is
|
---|
9 | biased and irrational, be aware.
|
---|
10 | #+END_abstract
|
---|
11 | I work in IT field as web developer for many years, but cannot claim
|
---|
12 | myself as professional. I don't like to work in general, I don't like
|
---|
13 | corporate IT culture and I don't like web development in particular, but
|
---|
14 | I has an experience in that field and it is much easier to dive in in
|
---|
15 | order to earn money for a living than other IT fields. I hope this text
|
---|
16 | will be useful for someone who is outside of field of web development
|
---|
17 | and wish to start earning money in that field.
|
---|
18 |
|
---|
19 | * What is tech stack
|
---|
20 | #+BEGIN_abstract
|
---|
21 | Tech stack is the mix of technologies (software, frameworks, libraries)
|
---|
22 | that project uses at your current or future company.
|
---|
23 | #+END_abstract
|
---|
24 |
|
---|
25 | Knowing everything from your techstack is not the only key for
|
---|
26 | success. It can sound obvious, but social skills can play more important
|
---|
27 | role than your programming skills. Programming is very social activity,
|
---|
28 | everything you are going to use is built by other people, sometimes
|
---|
29 | something breaks and you need to contact with people that provide you
|
---|
30 | software you use, it is also important to communicate with your
|
---|
31 | company's team and not bring yourself into conflicts. And don't be that
|
---|
32 | guys (or me), who hates something technical so much, that people get
|
---|
33 | annoyed by you, it won't help you in any way. It is kind of that,
|
---|
34 | because it can been seen as supression of your ego, but the truth is
|
---|
35 | that hired work is more about collectivism than individualism.
|
---|
36 |
|
---|
37 | Next I present the list of technologies you should know to work as web
|
---|
38 | developer. The list is not mandotary and you are not required to learn
|
---|
39 | it on expert level to get your job offer.
|
---|
40 |
|
---|
41 | * Fundamental technologies
|
---|
42 | Some things you will use in most of your projects, so you are better to
|
---|
43 | familarize with them anyway. What I've discovered, that most knowledge
|
---|
44 | of some tech is transfarable to other techs.
|
---|
45 | ** Text Editor
|
---|
46 | Not sure if I need to write it, but you need development environment
|
---|
47 | where you will write code, run tests and compile your project.
|
---|
48 |
|
---|
49 | *Most popular choices*
|
---|
50 | - [[https://gnu.org/software/emacs/][Emacs]] / [[https://www.vim.org/][Vim]] (I recommend them for a long run)
|
---|
51 | - Jetbrains IDE (proprietary)
|
---|
52 | - VSCode (proprietary)
|
---|
53 |
|
---|
54 | *Less popular*
|
---|
55 | - Sublime (proprietary)
|
---|
56 | - [[https://www.eclipse.org/][Eclipse]] / [[https://netbeans.apache.org/][Netbeans]] / [[https://www.kdevelop.org/][Kdevelop]]
|
---|
57 | - other editors and IDEs
|
---|
58 |
|
---|
59 | Proprietary means that source code is not available and probably it
|
---|
60 | costs money to use and you as a user don't have control over it. You can
|
---|
61 | learn more why it is important on [[https://gnu.org/philosophy/][GNU website]]. Such important tool as
|
---|
62 | text editor should be free for everyone.
|
---|
63 |
|
---|
64 | [[[https://en.wikipedia.org/wiki/Text_editor][Wikipedia: Text editor]]] |
|
---|
65 | [[[https://en.wikipedia.org/wiki/Integrated_development_environment][Wikipedia: Integrated development environment]]]
|
---|
66 |
|
---|
67 | ** SQL
|
---|
68 | Or it should be called persistance, but mostly you will use something
|
---|
69 | like [[https://www.postgresql.org/][Postgres]] or [[https://mariadb.com/kb/en/][MariaDB]]/[[https://mysql.com/][MySQL]]. Rarely it can be nosql like
|
---|
70 | mongodb.
|
---|
71 |
|
---|
72 | The database is the main thing aroud which you will develop your
|
---|
73 | application. I would say that the code is secondary compared to the data
|
---|
74 | you store and get from the database, so it is extremely good idea to
|
---|
75 | learn SQL well especially for a long run. For the start it is okay to
|
---|
76 | know a little and get going along the way, because you will probably
|
---|
77 | work with SQL through ORM.
|
---|
78 |
|
---|
79 | I recommend to use [[https://dbeaver.io/][Dbeaver]] as IDE for running SQL related code. It eases
|
---|
80 | the complexity of writing and running SQL.
|
---|
81 |
|
---|
82 | [[[https://en.wikipedia.org/wiki/SQL][Wikipedia: SQL]]] |
|
---|
83 | [[[https://en.wikipedia.org/wiki/Relational_database][Wikipedia: Reletational Database]]]
|
---|
84 |
|
---|
85 | *** ORM
|
---|
86 | Each tech stack provides ORM. It is quite rare, where you need to work
|
---|
87 | with pure SQL or the project doesn't use ORM at all. ORMs might be
|
---|
88 | something from the list:
|
---|
89 | - [[https://hibernate.org/][Hibernate]]
|
---|
90 | - [[https://docs.djangoproject.com/][Django ORM]]
|
---|
91 | - [[https://www.doctrine-project.org/][Doctrine]]
|
---|
92 | - [[https://sqlalchemy.org/][SQLAlchemy]]
|
---|
93 | - [[https://guides.rubyonrails.org/active_record_basics.html][Rails Active Record]]
|
---|
94 | - and many others
|
---|
95 |
|
---|
96 | [[[https://en.wikipedia.org/wiki/SQL][Wikipedia: SQL]]] | [[[https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping][Wikipedia: ORM]]]
|
---|
97 |
|
---|
98 | ** In-memory database
|
---|
99 | Some data needs to be stored in RAM for better performance. For that
|
---|
100 | cases you need to learn about Redis or similar technology.
|
---|
101 |
|
---|
102 | [[[https://en.wikipedia.org/wiki/In-memory_database][Wikipedia: In-memory database]]]
|
---|
103 |
|
---|
104 | ** HTTP Server and HTTP protocol
|
---|
105 | You don't actually need to know everything from the start, but since you
|
---|
106 | are going to work as web dev you need to know what you are using. It is
|
---|
107 | essential if you do backend APIs.
|
---|
108 |
|
---|
109 | HTTP server is usually [[https://en.wikipedia.org/wiki/Nginx][Nginx]] or [[https://en.wikipedia.org/wiki/Apache_HTTP_Server][Apache]] (it is used rarely now). If you
|
---|
110 | work with Java, http servers can be written in Java such as [[https://en.wikipedia.org/wiki/Jetty_(web_server)][Jetty]] and
|
---|
111 | others.
|
---|
112 |
|
---|
113 | [[[https://en.wikipedia.org/wiki/Web_server][Wikipedia: Web server]]] |
|
---|
114 | [[[https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol][Wikipedia: Hypertext Transfer Protocol]]]
|
---|
115 |
|
---|
116 | ** Fulltext search
|
---|
117 | You might need searching functionality. In basic cases it is okay to
|
---|
118 | include google search, but in many cases it is not acceptable choice. To
|
---|
119 | do a search like google does you will need fulltext search engines. You
|
---|
120 | can use your database for that or specific solutins like ElasticSearch
|
---|
121 | for such purpose.
|
---|
122 |
|
---|
123 | [[[https://en.wikipedia.org/wiki/Full-text_search][Wikipedia: Full-text search]]] |
|
---|
124 | [[[https://en.wikipedia.org/wiki/Elasticsearch][Wikipedia: Elasticsearch]]] (proprietary)
|
---|
125 |
|
---|
126 | ** Message broker
|
---|
127 | RabbitMQ, ZeroMQ, Kafka and others. You need those to create queues and
|
---|
128 | other stuff that needs to be delayed.
|
---|
129 |
|
---|
130 | [[https://en.wikipedia.org/wiki/Message_broker][Wikipedia: Message Broker]]
|
---|
131 |
|
---|
132 | ** Unix-like OS
|
---|
133 | You will probably work on Linux, variants of BSD system or macs. You
|
---|
134 | need to familiarize with the system you use, different tasks require
|
---|
135 | different degree of that skill, but knowledge of what you are using
|
---|
136 | every day will be handy.
|
---|
137 |
|
---|
138 | There are many ways to learn it, but I recommend try to install it on
|
---|
139 | your machine and learn it along the way. I recommend to start with
|
---|
140 | [[https://debian.org/][Debian GNU/Linux distribution]]. You can read [[https://www.debian.org/doc/manuals/debian-faq/][FAQ]], manuals about
|
---|
141 | [[https://www.debian.org/releases/stable/amd64/index.en.html][installation]] and [[https://www.debian.org/doc/manuals/debian-reference/][how to use the system]]. Docs are very useful, they are
|
---|
142 | will be present in your filesystem you can read it by jumping into
|
---|
143 | /usr/share/docs folder or running ~info~ and ~man~ commands. I recommend to
|
---|
144 | read it and explore Debian website. Also for learning linux Arch Linux
|
---|
145 | wiki is good source of knowledge (Slackware and Gentoo wikis are good as
|
---|
146 | well).
|
---|
147 |
|
---|
148 | [[[https://en.wikipedia.org/wiki/Unix][Wikipedia: Unix]]] |
|
---|
149 | [[[https://en.wikipedia.org/wiki/Linux][Wikipedia: Linux]]] |
|
---|
150 | [[[https://en.wikipedia.org/wiki/Linux_distribution][Wikipedia: Linux distribution]]]
|
---|
151 |
|
---|
152 | ** OOP
|
---|
153 | In corporate IT culture you will probably forced to use OOP
|
---|
154 | techniques. It is not something that really improves development that
|
---|
155 | much, but it is very common way to orginize codebase and it is kind of
|
---|
156 | great for working with many people.
|
---|
157 |
|
---|
158 | Not everyone will degree with my definition, but patterns are needed to
|
---|
159 | express by your programming language object system, which is impossible
|
---|
160 | to express otherwise, because of different language limits. It is very
|
---|
161 | true for very static and not expressive language like PHP or Java and
|
---|
162 | less true for more expressive languages like Lisp and Haskell.
|
---|
163 |
|
---|
164 | Besides basic principle of using OOP in your programming language of
|
---|
165 | choice you are going to need patterns to learn. The benefits of them are
|
---|
166 | questinable, but it is not bad to know and they are being asked on
|
---|
167 | interviews very often.
|
---|
168 |
|
---|
169 | The best way to learn patterns are to use [[https://en.wikipedia.org/wiki/Smalltalk][Smalltalk]] and read the book
|
---|
170 | [[https://en.wikipedia.org/wiki/Design_Patterns]["Gang of Four"]]. Also there is very useful website about design patterns
|
---|
171 | with examples in many mainstream languages: https://refactoring.guru/
|
---|
172 |
|
---|
173 | [[[https://en.wikipedia.org/wiki/Object-oriented_programming][Wikipedia: OOP]]]
|
---|
174 |
|
---|
175 | ** Debugger
|
---|
176 | You have a chance to work with others people code, so you have a chance
|
---|
177 | to get confused by a lot of stuff going on. Also it is possible that you
|
---|
178 | would make a mistake and will not understand what is going on, where is
|
---|
179 | an error. In that case you will need a debugger. Debugger is usually can
|
---|
180 | be the part of your text editor environment and it is usually included
|
---|
181 | in your programming environment alongside your interpreter /
|
---|
182 | compiler. Some languages don't include a debugger, so you need to
|
---|
183 | download it seperately.
|
---|
184 |
|
---|
185 | Debugger allows you to step through your code and see the values of
|
---|
186 | stack and heap, basically you get an access to everything evaluated by
|
---|
187 | your interpreter/compiler. It is very common practice to use such a
|
---|
188 | thing when errors happen and I personally think, that it is great way to
|
---|
189 | learn how your language of choice works internally.
|
---|
190 |
|
---|
191 | [[[https://en.wikipedia.org/wiki/Debugger][Wikipedia: Debugger]]]
|
---|
192 |
|
---|
193 | ** Profiler
|
---|
194 | Profiler is similar to debugger, but it helps you to detect which part
|
---|
195 | of your programm is running slow, it also helps you detect memory
|
---|
196 | leaks. Sometimes you or others write functions and does everything as
|
---|
197 | intended, but it is running slow. To understand which part of your code
|
---|
198 | is a bottleneck you need to run it in a profiler. Then profiler will
|
---|
199 | show you an diagram with execution time and memory consumption of your
|
---|
200 | functions, which is helpful even when everything works fine.
|
---|
201 |
|
---|
202 | [[[https://en.wikipedia.org/wiki/Profiling_(computer_programming)][Wikipedia: Profiler]]]
|
---|
203 |
|
---|
204 | ** Frontend
|
---|
205 | If you are not exclusively backend developer, you will probably need to
|
---|
206 | work with templates. Templates represent the outer view of your website,
|
---|
207 | which represents backend's inner workings. Frontend part can be done
|
---|
208 | using template engine or can be done as Single Page Application with
|
---|
209 | lots of client-side javascript coe.
|
---|
210 |
|
---|
211 |
|
---|
212 | *** HTML
|
---|
213 | HTML is being used for representing your website information to your
|
---|
214 | users. It contains only structural data and very basic formatting. If
|
---|
215 | you see something that looks like old document, that is probably plain
|
---|
216 | html used.
|
---|
217 |
|
---|
218 | [[[https://en.wikipedia.org/wiki/Web_template_system][Wikipedia: Web Template System]]] |
|
---|
219 | [[[https://en.wikipedia.org/wiki/Single-page_application][Wikipedia: Single-page Application]]]
|
---|
220 |
|
---|
221 | *** CSS
|
---|
222 | CSS is being used for creating styling for your html pages. The role of
|
---|
223 | CSS is to make your html layouts pretty, to make your buttons beatiful
|
---|
224 | and grid is clear.
|
---|
225 |
|
---|
226 | [[[https://en.wikipedia.org/wiki/CSS][Wikipedia: CSS]]]
|
---|
227 |
|
---|
228 | *** Javascript
|
---|
229 | Javascript is being used for creating interectivity with your HTML
|
---|
230 | pages. If you see dropdown menu, carousel or a slider, there is probably
|
---|
231 | javascript involved. Javascript is big and complex programming language,
|
---|
232 | so you as web developer will be required to know only subset of it
|
---|
233 | except if your main programming language is Javascript.
|
---|
234 |
|
---|
235 | [[[https://en.wikipedia.org/wiki/Javascript][Wikipedia: Javascript]]]
|
---|
236 |
|
---|
237 | *** Template engines
|
---|
238 | Template engines are needed to transfer your backend data to your
|
---|
239 | user. It provides the way to generate HTML with embedding variables and
|
---|
240 | different function for developer's ease. Template engine is usually
|
---|
241 | built-in in your framework of choice.
|
---|
242 |
|
---|
243 | [[[https://en.wikipedia.org/wiki/Template_processor][Wikipedia: Template Processor]]]
|
---|
244 |
|
---|
245 | ** Docker
|
---|
246 | Your team probably will use docker for deployment or development (or
|
---|
247 | both). Anyway you might want to get your project working in a container
|
---|
248 | for better accessability by your team. The point of docker as
|
---|
249 | development tool is to let your team quickly to get the same environment
|
---|
250 | as you. The point of docker as deployment tool to deploy the same
|
---|
251 | environment that you developing in, its important to have reproducible
|
---|
252 | production environment, because catching bugs in 3 different
|
---|
253 | environments (dev, staging, prod) suck a lot.
|
---|
254 | ** API
|
---|
255 | There are standard ways to build APIs. If you are going to focus on that
|
---|
256 | part of application, only backend work, you should learn it.
|
---|
257 | - RestAPI
|
---|
258 | - JSONAPI
|
---|
259 | -
|
---|
260 | ** Type hierarchy and standard library
|
---|
261 |
|
---|
262 | ** Framework or(and) set of libraries
|
---|
263 | Every job sticks on their own stack. Very often it sticks to one
|
---|
264 | specific web framework, that you are required to learn. It can be
|
---|
265 | something like Django, Symfony, Spring, Ruby on Rails or others.
|
---|
266 |
|
---|
267 | Frameworks are usually the biggest part of your codebase. The difference
|
---|
268 | between framework and library: Framework runs your code with your
|
---|
269 | classes, but libraries are being used by you explicitly and you execute
|
---|
270 | all the code from them. The concept of reverting the control over the
|
---|
271 | code to your framework is called [[https://en.wikipedia.org/wiki/Inversion_of_control][Inversion of Control]].
|
---|
272 | ** Programming language
|
---|
273 |
|
---|
274 | You will need to
|
---|
275 | * Most popular programming languages
|
---|
276 | Basically your choices are quite limited here. More jobs available, more
|
---|
277 | chances to get that job. there will be different results in different
|
---|
278 | areas. I think that in most areas you will have a choices between Java,
|
---|
279 | Python and maybe PHP or Ruby. If you want to end up insane, there is
|
---|
280 | also Javascript, but it is not that mature for backend as other
|
---|
281 | technologies, so I will not include it (there is only "big" framework
|
---|
282 | called NestJS, its demand should be low).
|
---|
283 |
|
---|
284 | ** Java / C#
|
---|
285 | Probably the most popular programming languages out there especially
|
---|
286 | when it comes to working at companies. It is statically typed and quite
|
---|
287 | easy to learn languages. They are restricted to OOP only, so you
|
---|
288 | prorably will use oop design patterns here the most. Type system are not
|
---|
289 | that advanced as in ML dialects and actually it is unsound, but it
|
---|
290 | provides some merits of safety compared to nonsafe C.
|
---|
291 |
|
---|
292 | Frameworks:
|
---|
293 | - Spring
|
---|
294 | - .Net
|
---|
295 |
|
---|
296 | ORM:
|
---|
297 | - Hibernate
|
---|
298 |
|
---|
299 | ** Python
|
---|
300 | Second the most popular programming language. It differs from Java a
|
---|
301 | lot. It is dynamic typed, more object oriented (everything is an
|
---|
302 | object), it forces you to indent your code right.
|
---|
303 |
|
---|
304 | Frameworks:
|
---|
305 | - Django
|
---|
306 | - Flask
|
---|
307 | - FastAPI
|
---|
308 |
|
---|
309 | ORM:
|
---|
310 | - Django ORM
|
---|
311 | - SQLAlchemy
|
---|
312 |
|
---|
313 | ** PHP
|
---|
314 | PHP might be unpopular in some areas, but it is quite popular in
|
---|
315 | Russia. It runs lots of small businesses and it is probably the easiest
|
---|
316 | tech stack to get a job (but not the easiest language to work with). The
|
---|
317 | language has lots of caveats such as weak typing, unorganized standard
|
---|
318 | library, less developed OOP and type checking, lots of procedural php
|
---|
319 | legacy, most functions of the language is defined in C.
|
---|
320 |
|
---|
321 | Frameworks:
|
---|
322 | - Symfony
|
---|
323 | - Laravel
|
---|
324 |
|
---|
325 | ORM:
|
---|
326 | - Doctrine
|
---|
327 |
|
---|
328 | * Less popular programming language
|
---|
329 | ** Go
|
---|
330 | ** Ruby
|
---|
331 | Ruby is mostly used solely for web development with popular Ruby on
|
---|
332 | Rails framework. The demand of it might be low in some areas, so
|
---|
333 | investigate your market yourself before learning it. Ruby is strongly
|
---|
334 | type object-oriented in smalltalk sense language. It has mixed lisp,
|
---|
335 | perl and smalltalk roots.
|
---|
336 |
|
---|
337 | Frameworks:
|
---|
338 | - Ruby on Rails
|
---|
339 | - Sinatra
|
---|
340 |
|
---|
341 | ORM:
|
---|
342 | - Active Record
|
---|
343 | - DataMapper
|
---|
344 |
|
---|
345 | * Great language, but bad for finding work
|
---|
346 | * How to get good
|
---|
347 | First of all don't buy any paid course or workshops, most information
|
---|
348 | are available for free for everyone. Just read wikipedia links I
|
---|
349 | provided in artible and follow links there to official documentation of
|
---|
350 | the thing you want to learn.
|
---|
351 |
|
---|
352 | When it comes to programming in general I recommend to learn it doing
|
---|
353 | test projects or just playing with the code. For practice you can also
|
---|
354 | use services like Exercism or Codewars to practice pure programming
|
---|
355 | solving problems. Also there is great web-resource for complete
|
---|
356 | beginners called [[https://freecodecamp.org/][FreeCodeCamp]], it covers basics of web development and
|
---|
357 | javascript programming.
|
---|
358 |
|
---|
359 | Also I recommend reading old academic books on programming, because many
|
---|
360 | concepts are the same in many programming languages, what you need is
|
---|
361 | the ability think abstractly using data structures and algorhythms. I
|
---|
362 | recommend anyone who wants to really grock programming to read:
|
---|
363 | - [[https://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs][SICP]] (mit scheme)
|
---|
364 | - [[https://en.wikipedia.org/wiki/How_to_Design_Programs][HTDP]] (racket)
|
---|
365 | - [[https://www.cis.upenn.edu/~bcpierce/tapl/][TAPL]]
|
---|
366 | - [[https://en.wikipedia.org/wiki/Essentials_of_Programming_Languages][Essentials Of Programming Languages]]
|
---|
367 | - [[https://download-mirror.savannah.gnu.org/releases/pgubook/ProgrammingGroundUp-1-0-booksize.pdf][Programming from the ground up]]
|
---|
368 | - Also see [[https://www.gnu.org/doc/other-free-books.html][free books from GNU website]]
|
---|
369 |
|
---|
370 | /Basically the rule of thumb is that if the book has wikipedia article, it is probably a good book and you should read it/.
|
---|
371 |
|
---|
372 | There are many free sources to learn you just need to invest your time
|
---|
373 | into it. The downside of learning LISP is that mainstream programming on
|
---|
374 | your job can feel very restrictive and less expressive. Also you will
|
---|
375 | probably learn, that many mainstream languages have lots of quircks or
|
---|
376 | plainly bad design decisions.
|
---|
377 |
|
---|
378 | * Conclusion
|
---|
379 | It is possible to get a job with less popular stack, but if you are just
|
---|
380 | starting it might be reasonable to focus on popular one first. The list
|
---|
381 | of technologies is quite big, so newbies can be lost in new
|
---|
382 | information. Be patient and learn one thing at the time. I would
|
---|
383 | recommend starting with programming language documentation, then SQL and
|
---|
384 | then going to docs of your web-framework / library.
|
---|
385 |
|
---|
386 | Demand for web developers is huge and in my opinion it is the easiest
|
---|
387 | way to get a job. The web development sucks in general (at least for
|
---|
388 | me), but that topic will be hold for another article.
|
---|
389 |
|
---|
390 | If to continue tech stack tier list sorted by popularity next one should be:
|
---|
391 |
|
---|
392 | ** Advanced tier
|
---|
393 | - Scala
|
---|
394 | - Clojure
|
---|
395 | - Erlang
|
---|
396 | - Rust
|
---|
397 |
|
---|
398 | ** Rare tier
|
---|
399 | - Common Lisp / Scheme
|
---|
400 | - Haskell
|
---|
401 | - SML / Ocaml
|
---|
402 | ** Rare and legacy tier
|
---|
403 | - Perl
|
---|
404 | - Cobol
|
---|