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