> For the complete documentation index, see [llms.txt](https://strctr.gitbook.io/programming/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://strctr.gitbook.io/programming/master.md).

# Programming

## Software Development

<https://free-for.dev/#/>

<https://www.youtube.com/user/Computerphile/playlists> <https://github.com/mtdvio/every-programmer-should-know> 🔥 <https://web.archive.org/web/20121106102625/http:/blog.objectmentor.com/articles/2009/02/26/10-papers-every-programmer-should-read-at-least-twice>

<https://github.com/Developer-Y/cs-video-courses> - lecture courses <https://github.com/EbookFoundation/free-programming-books> <https://teachyourselfcs.com/>

Здесь про общую практику программирования, методы, абстракции, инструменты.

<https://github.com/Hexlet/hexlet-slack-archive/wiki> - разговоры на hexlet

<https://github.com/jwasham/coding-interview-university>

Важные идеи в программировании:

* Domain Drived Design - показала важность отражения сущностей реального мира в коде.
* Continious Delivery - завершением каждого рабочего этапа должен быть выпуск удачной версии продукта.
* Networking и архитектура Web - показала как можно строить масштабируемые архитектуры в которых логика взаимодействия скрыта.
* Dockerization -
* DevOps - намерение команды полностью владеть своим сервисом.
* Continous Integration -

<http://coderstoolbox.net/>

Видео Кирила Молевкина <https://www.youtube.com/playlist?list=PL0vozJOrHoiLctFgohTe8wuIF5uDzkEWT>

<https://dev.tube/> - selected videos for developers

<https://henrikwarne.com/2015/04/16/lessons-learned-in-software-development/> <https://blog.juliobiason.net/thoughts/things-i-learnt-the-hard-way/>

* Spec first, then code
* Write steps as comments
* Unit tests are good, integration tests are gooder
* Tests make better APIs
* Be ready to throw your code away. TDD was designed to throw code away. You shouldn't worry about this. Your code is not a wall: if you have to throw it always, it is not wasted material. Surely it means your time writing code was lost, but you got a better understanding about the problem now.
* Good languages come with integrated tests.
* Future thinking is future trashing. Don't solve problems for a future problems. Solve the problem you have right now.
* Documentation is a love letter to your future self
* The function documentation is its contract
* If a function description includes an "and", it's wrong
* Don't use Booleans as parameters
* Good languages come with integrated documentation
* A language is much more than a language. A programming language is that thing that you write and make things "go". But it has much more beyond special words: It has a build system, it has a dependency control system, it has a way of making tools/libraries/frameworks interact, it has a community, it has a way of dealing with people.
* Types say what you data is
* Data flows beat patterns
* Design patterns are used to describe solutions, not to find them. First, solve your problem; find a good solution; then you can check the patterns to know how you name that solution.
* ALWAYS use timezones with your dates. When dealing with dates, always always add the timezone with it. There will be always a problem with your computer timezone and the production server timezone (or one of the instances timezones) and you'll lose a lot of time trying to debug what the heck the interface is showing the wrong time.
* Loggers beats debuggers
* Learn to monitor. Adding monitoring early will help you understand how your system behaves.
* Companies look for specialists but keep generalists longer
* The best secure way to deal with user data is not to capture it
* Keep a list of "Things I Don't Know"

Excercises <https://codelabs.developers.google.com/>

Онлайн университет <https://welcome.stepik.org/en>

Effective Mental Models for Code and Systems <https://medium.com/@copyconstruct/effective-mental-models-for-code-and-systems-7c55918f1b3e>

SICP <https://composingprograms.com/pages/12-elements-of-programming.html> <https://gist.github.com/anton-kabysh/00b3674a4593b05e6a451671e235c32e>

<https://twitter.com/akhmylov/status/1171812708049707008>

<https://www.csc.gov.sg/articles/how-to-build-good-software> <https://matthewreinbold.com/2019/07/17/OvercomingComplexity/>

<https://habr.com/ru/post/317312/> <https://habr.com/ru/post/317850/> <https://guides.hexlet.io/check-list-of-engineering-practices/>
