General cleanup of repository

This commit is contained in:
Evgeny Salmer
2023-02-01 00:10:44 +01:00
parent c4b2d41f99
commit 8b9b1daa13
27 changed files with 1 additions and 18147 deletions

View File

@@ -27,6 +27,7 @@ It is a developer who has theoretical knowledge of software development and litt
- Don't bury yourself in the task for too long. If after several attempts there is no progress, immediately contact your colleagues for help. They expect that the task will be completed by you within a reasonable period. Your main goal is to solve problems, not create them for the team.
- When difficulties arise, try to find a couple of possible solutions yourself, and then approach your mentor. Your mentor will adjust or complement your solution.
- Juniors tend to fall into a common trap: the more lines of code are written, the cooler they are as developers. Don't get caught! Remember, the more code you write, the higher the chance of an error. Ideally, the code should be written so that when you return to it six months later, you can quickly recall what it does. A good developer is not someone who writes a lot of code. A good developer behaves like a samurai: he delivers one precise and deadly blow, rather than pointlessly swinging his sword to hit the enemy.
---
[**Go back**](Overview.md) | [**To main page**](../../README.md)

View File

@@ -1 +0,0 @@
Original README has moved to main page: [go to original page](https://github.com/salmer/CppDeveloperRoadmap)

View File

@@ -1,12 +0,0 @@
# Application areas of C++
The C ++ language has a wide range of applications. It is mainly used if high performance or low memory consumption is required. Below you can find materials that describe in more detail the application areas of C++:
- [What Is C++ Used For? Top 12 Real-World Applications And Uses Of C++](https://www.softwaretestinghelp.com/cpp-applications/)
- [Why and where should you still use C/C++ languages?](https://hackernoon.com/why-and-where-should-you-still-use-cc-languages-6l1r838gh)
- [What Can You Do With C++?](https://www.ko2.co.uk/what-can-you-do-with-c-plus-plus/)
- [C++ Applications](https://www.stroustrup.com/applications.html)
- [What is C++ used for?](https://www.codecademy.com/resources/blog/what-is-c-plus-plus-used-for/)
---
[**To main page**](../README.md)

View File

@@ -1,52 +0,0 @@
# Junior
## Motivation and experience
- [Robert Martin - The clean coder](https://www.amazon.com/Clean-Coder-Conduct-Professional-Programmers/dp/0137081073)
Uncle Bob shares his recommendations on how to "survive" and be successful in the IT industry. This book isn't just about technical skills. It also presents psychological challenges and struggles with them.
- [Robert Martin - Clean Code: A Handbook of Agile Software Craftsmanship](https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882)
Nowadays, you might find a lot of criticism about this book. Despite all, we still guess this book can be quite helpful for newbies rather than harmful in short-term distance. This book contains a collection of working tricks which will help you to write well-structured, readable and maintainable code. As with any other knowledge, don't try to place on the "throne" and transform it to cargo-cult. Use this knowledge wisely. Try to collect a set of tricks from the book which are suitable for you and helpful for improving of your code-style.
- [Steve McConnell - Code Complete: A Practical Handbook of Software Construction](https://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670)
Despite the book ages, it might be called a developer's "bible". It systemizes all knowledge of how the IT industry looks like. This book also proposes tons of useful advice: how to grow and become a 1-st class professional.
## Computer Science
- [Thomas H. Cormen - Introduction to Algorithms](https://www.amazon.com/Introduction-Algorithms-3rd-MIT-Press/dp/0262033844)
This book is a perfect continuation after "Grokking algorithms". This book introduces common algorithms of sorting, working with lists, etc., but gives more details. It is written in a friendly way. It will be helpful to prepare yourself for deep diving in algorithms area.
## C++
- [Scott Meyers - Effective C++: 55 Specific Ways to Improve Your Programs and Designs](https://www.amazon.com/Effective-Specific-Improve-Programs-Designs/dp/0321334876)
This book is a perfect cookbook of C++ foundations. This book is about C++03 features, but it's still valuable and relevant information. All recommendations described in this book are perfectly suitable for the newest standards.
- [Jason Turner - C++ Best Practices: 45ish Simple Rules with Specific Action Items for Better C++](https://www.amazon.com/Best-Practices-Simple-Specific-Action/dp/B08SJSZKJ5)
A collection of tips for developers with little experience writing C++ code. It contains recommendations on the most common errors. All explanations are presented briefly and concisely. The most of these recommendations contain links to additional sources. This book doesn't provide a fundamental analysis of each advice, therefore it is recommended to deal with each recommendation in more detail in the future in order to understand true reasons behind them.
- [Herb Sutter, Andrei Alexandrescu - C++ Coding Standards: 101 Rules, Guidelines, and Best Practices](https://www.amazon.com/Coding-Standards-Rules-Guidelines-Practices/dp/0321113586)
This tiny book describes common best practices of code writing around commercial projects. It's an aggregation of experience collected from different companies. This book was also a foundation for the [C++ Core Guidelines](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines). You can immediately visit C++ Core Guidelines, but it's still recommended starting with this book first. It will help you to get a first impression of code guidelines spread around projects. When it's done, you can visit the C++ Core Guidelines website and get the latest approved approaches.
## Hard skills
- [Eric Freeman, Elisabeth Robson - Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/Head-First-Design-Patterns-Brain-Friendly/dp/0596007124)
This book is a perfect start to studying design patterns. As another alternative, you can also visit [refactoring.guru](https://refactoring.guru/design-patterns), but in case of using this book, you will be able to have a lot of practice on-the-fly which help you to better understand ideas of common design patterns.
- [Sanjay Madhav, Josh Glazer - Multiplayer Game Programming: Architecting Networked Games](https://www.amazon.com/Multiplayer-Game-Programming-Architecting-Networked/dp/0134034309)
This book is an excellent introduction to networking theory. It will explain network foundations through video games examples. They will help you to write your first application working via a network. Besides a theory, you will gain experience in how to work with it in C++. All examples are written in C++11/14.
---
[**Go back**](Overview.md) | [**To main page**](../../README.md)

View File

@@ -1,85 +0,0 @@
# Middle
## C++
- [Scott Meyers - Effective Modern C++: 42 Specific Ways to Improve Your Use of C++11 and C++14](https://www.amazon.com/Effective-Modern-Specific-Ways-Improve/dp/1491903996)
It's a new chapter of a Scott Meyers books collection. This book contains a collection of advice about C++11/14 standards.
- [Anthony Williams - C++ Concurrency in Action](https://www.amazon.com/C-Concurrency-Action-Anthony-Williams/dp/1617294691/ref=sr_1_3?keywords=C%2B%2B+Concurrency+in+Action%3A+Practical+Multithreading&qid=1636314477&s=books&sr=1-3)
This book is a guide for multithreading programming and using the standard library features. It contains detailed explanations about all primitives and their nuances "behind the curtain".
- Herb Sutter:
- [Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions](https://www.amazon.com/Exceptional-Engineering-Programming-Problems-Solutions/dp/0201615622)
- [Exceptional C++ Style: 40 New Engineering Puzzles, Programming Problems, and Solutions](https://www.amazon.com/Exceptional-Style-Engineering-Programming-Solutions/dp/0201760428)
- [More Exceptional C++: 40 New Engineering Puzzles, Programming Problems, and Solutions](https://www.amazon.com/More-Exceptional-Engineering-Programming-Solutions/dp/020170434X)
The collection of books describes a lot of tasks related to designing or writing code in C++. They propose a collection of effective solutions. A lot of them are approved and declared as classic idioms. You will regularly find these idioms around projects.
- [David Vandevoorde - C++ Templates: The Complete Guide](https://www.amazon.com/C-Templates-Complete-Guide-2nd/dp/0321714121)
The newest and relevant book about C++ metaprogramming (templates). This giant work describes relevant technics of templates foundations that were added in the newest standards, including C++17. If you need to write generic and parameterized code, this book will become a "bible" to you. You will get knowledge either about the basics of templates or tones of nuances related to different technics.
## Optimization for C++ applications
- [Kurt Guntheroth - Optimized C++: Proven Techniques for Heightened Performance](https://www.amazon.com/Optimized-Proven-Techniques-Heightened-Performance/dp/1491922060)
This book is a guidebook for the performance improvement of C++ applications. Some advice in this book is based on different idioms and tricks described in books of Herb Sutter or Scott Meyers. It's recommended to read this book after reading the books above.
- [Agner Fog - Optimizing software in C++](https://agner.org/optimize/optimizing_cpp.pdf) or [Optimization manuals](https://agner.org/optimize)
Practical-oriented guides that provide comprehensive information about the potential optimization possibilities of applications developed in C++, or related to interaction with the CPU, memory, etc.
## Hard skills
- [Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides or "Gang of Four" - Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612)
This book is a classic guidebook of design patterns. Each pattern is precisely described and advised to a suitable use-case. This book is a good continuation of "Head First Design Patterns" by Eric Freeman. But be ready, this book is more complex than the previous one.
- [Gary McLean Hall - Adaptive Code](https://www.amazon.com/Adaptive-Code-Developer-Best-Practices/dp/0136891446)
One of the best books that describe SOLID principles in simple terms. All code examples are written in C#, but it shouldn't be a problem as they were written in a simplistic way.
- [Robert Martin - Clean Architecture: A Craftsman's Guide to Software Structure and Design](https://www.amazon.com/Clean-Architecture-Craftsmans-Software-Structure/dp/0134494164)
One more work by Uncle Bob. For this time, this book will explain how to think about the architecture of an application/component first before starting rushing into coding. It shows where to pay attention upon analyzing a solution design. This book is a good start for people who are interested in architecture tasks in software design and don't know where to begin. The knowledge from this book is common for a lot of engineers and will be useful to prevent widespread mistakes in software design.
- [Samary Baranov - Finite State Machines and Algorithmic State Machines: Fast and Simple Design of Complex Finite State Machines](https://www.amazon.com/Finite-State-Machines-Algorithmic-Complex-ebook/dp/B078RYYBCJ)
The short practical guide on how to approach writing programs using finite machines theory. It will be difficult to find a simpler and more elegant description of the theory of finite machines and its practical application.
## Operating systems
- [Andrew S. Tanenbaum - Modern Operating Systems](https://www.amazon.com/Modern-Operating-Systems-Andrew-Tanenbaum/dp/013359162X)
The best book about operating systems. This is a fundamental book about its construction: file system, network, memory management, task scheduler, multithreading, etc. Each chapter contains large explanations for different OS aspects. It tries to explain deep details in simple words, but without diving in specific OS distributive.
- [Mark Russinovich - Windows Internals, Part 1](https://www.amazon.com/Windows-Internals-Part-architecture-management/dp/0735684189), [Mark Russinovich - Windows Internals, Part 2](https://www.amazon.com/Windows-Internals-Part-2-7th/dp/0135462401)
This book discusses the same issues as the previous book, but focuses exclusively on Microsoft Windows OS. It dwells in detail on every aspect of the OS with a projection on Windows, and also talks about various nuances and aspects that may not be officially declared by the developers. A useful book for those who develop low-level applications that require intensive interaction with OS system libraries.
- [Christopher Negus - Linux Bible](https://www.amazon.com/Linux-Bible-Christopher-Negus/dp/1119578884)
This book can be a continuation after Tanenbaum's work. It goes into detail on every aspect of the Linux OS. All examples are analyzed for popular distributions: Red Hat, Ubuntu and Fedora. Suitable for developers who use this OS in their daily activities.
- [Ulrich Drepper - What Every Programmer Should Know About Memory](https://people.freebsd.org/~lstewart/articles/cpumemory.pdf)
This article is a good overview: how PC memory works and why it works in the described way. It shows not only high-level representation, but low-level aspects are also described (if you have an intention to dive in this area).
## Computer networks
- [Andrew S. Tanenbaum - Computer Networks](https://www.amazon.com/Computer-Networks-5th-Andrew-Tanenbaum/dp/0132126958)
A classic book on the theoretical foundations of computer networks. It contains a detailed description, starting from the physical layer and ending with data transfer protocols. It will be extremely useful for those developers who are closely involved in projects that interact with networks.
- [Victor Olifer - Computer Networks: Principles, Technologies and Protocols for Network Design](https://www.amazon.com/Computer-Networks-Principles-Technologies-Protocols-ebook/dp/B001GQ35P4)
Another great book on the basics of computer networks. At some points, the presentation of information can seem a little more complicated, compared to Tanenbaum's work. Therefore, we recommend choosing the book whose narrative is more suitable for you.
---
[**Go back**](Overview.md) | [**To main page**](../../README.md)

View File

@@ -1,12 +0,0 @@
# Books and sources
These articles will help you find your way to study C++. All books are divided according to suitable grades. It's recommended to check suitable books corresponding to your current grade and choose those that fit you the best. The presented library does not concentrate on books related to any specific domain area or highly specialized areas. The idea of this project is to help people acquire generic knowledge about C++ and software development. If you are looking for specified materials, we recommend you contact experts in an area you are interested in.
- [PreJunior](PreJunior.md)
- [Junior](Junior.md)
- [Middle](Middle.md)
- [Senior](Senior.md)
---
[**To main page**](../../README.md)

View File

@@ -1,48 +0,0 @@
# Pre-Junior
## Motivation and experience
- [Chad Fowler - Passionate Programmer](https://www.amazon.com/Passionate-Programmer-Remarkable-Development-Pragmatic-ebook/dp/B00AYQNR5U)
This book can be called a classic in the motivation genre for beginners. Chad Fowler tries to share his experience: how to become a professional programmer and ride the IT industry wave.
## Computer Science
- [Wladston Ferreira Filho - Computer Science Distilled: Learn the Art of Solving Computational Problems](https://www.amazon.com/Computer-Science-Distilled-Computational-Problems/dp/0997316020)
The book is an overview on different Computer Science basics: math, algorithms, databases, hardware basics of computers, etc. It can be a good starting point to find interesting areas for yourself and to prioritize them.
- [Charles Petzold - Code: The Hidden Language of Computer Hardware and Software](https://www.amazon.com/Code-Language-Computer-Hardware-Software/dp/0735611319)
Before starting studying C++ it's recommended to pick this book first. In simple words, it describes how a computer works. It avoids complex technical or theoretical aspects. This book contains foundations that won't become obsolete in the far future. It will also help you to better understand the foundation ideas of C++ later. This book is a good complement to the previous one as it dives deeper into the device of computers.
- [Aditya Bhargava - Grokking Algorithms: An Illustrated Guide for Programmers and Other Curious People](https://www.amazon.com/Grokking-Algorithms-illustrated-programmers-curious/dp/1617292230)
The book contains a brilliant introduction to the world of Computers Science algorithms and data structures for beginners. It also contains a list of tasks that will help you to implement your first algorithms.
## C++
- [Stephen Prata - C++ Primer Plus](https://www.amazon.com/Primer-Plus-6th-Developers-Library/dp/0321776402)
The book is an excellent start for people who stand at the beginning of the studying path in C++ World. It doesn't require any extra knowledge to start your path. This book also contains a list of exercises which help to get experience and understanding of C++ basics.
- [Stanley Lippman - C++ Primer](https://www.amazon.com/Primer-5th-Stanley-B-Lippman/dp/0321714113)
The book is a good complement to the previous one. It's good to use this book in parallel with Prata's book. We recommend you find a balance between these books, as information is given differently: mixing information from both books will help you to better understand different topics and language aspects.
- [Andrew Koenig - Accelerated C++: Practical Programming by Example](https://www.amazon.com/Accelerated-C-Practical-Programming-Example/dp/020170353X)
This book is an excellent one for beginners. Each chapter of the book widely describes a different foundation aspect of the language. When it's done, it offers you a set of exercises to train yourself. The book explains the most fundamental topics that can be reused in the future to study new language mechanisms. It's recommended to pick up this book after Prata's, Lippman's books or in parallel with them.
## Hard skills
- [MSDN](https://docs.microsoft.com/en-us/cpp/build/vscpp-step-0-installation?view=msvc-160)
If you are at the starting point of your studying path, it's recommended to start practicing and doing exercises in the IDE: Microsoft Visual Studio (Community Edition). Nowadays, it's one of the friendliest IDEs among others to beginners, either in installation or usage (and it's absolutely for free!). It will help you to concentrate on language and not to struggle with the development environment. On MSDN you will find a nice guidebook that describes the following aspects: how to install the Visual Studio, create the first console project, and implement the first application.
---
[**Go back**](Overview.md) | [**To main page**](../../README.md)

View File

@@ -1,55 +0,0 @@
# Senior
## C++
- There are no concrete advice about books for seniors. At this grade, you should already know the foundations of C++ well enough. There is only one challenge for you: to monitor the latest standards and new features for C++ or tools for C++ ecosystem.
## Team management
- [J. Hank Rainwater - Herding Cats: A Primer for Programmers Who Lead Programmers ](https://www.amazon.com/Herding-Cats-Primer-Programmers-Lead/dp/1590590171)
The classic books that tells about the difficulties that arise when managing developers. Although this book is outdated in some aspects, nevertheless it will be an excellent start for finding information about managing programmers. Many chapters are still relevant, and will also give an initial idea of managing people. Such knowledge can be useful when monitoring junior developers.
- [Michael Lopp - Managing Humans: Biting and Humorous Tales of a Software Engineering Manager](https://www.amazon.com/Managing-Humans-Humorous-Software-Engineering/dp/1484221575)
This book explains about how to be a leader, what difficulties such a person faces. It will help you learn to think like a manager, to understand what problems bother your manager. This will allow you to build a more effective interaction between you, the manager and the development team.
- [Frederick Brooks - Mythical Man-Month, The: Essays on Software Engineering](https://www.amazon.com/Mythical-Man-Month-Software-Engineering-Anniversary/dp/0201835959)
This book is also considered a classic in project management. The book is focused on the mistakes that are made on projects that lead to their failures. Today, this work is also partly considered outdated, but for those developers who are just starting their way as a manager, this book will be a great start to protect themselves from typical mistakes.
- [Tom DeMarco - The Deadline: A Novel About Project Management](https://www.amazon.com/Deadline-Novel-About-Project-Management-ebook/dp/B006MN4RAS)
The book is a novel that tells about the work of a manager and how project management takes place. It is extremely useful because it conveys in an artistic manner the colossal experience of managerial everyday life. It is extremely useful because it most fully reveals the issues that the manager faces on a daily basis.
- [Daniel Kahneman - Thinking, Fast and Slow](https://www.amazon.com/Thinking-Fast-Slow-Daniel-Kahneman/dp/0374533555)
The classic book about the logical errors of human thinking. It is useful because it will help to take a more rational approach to making various decisions, taking into account cognitive distortions in human thinking. This is an extremely necessary skill for specialists who are in the area of making key decisions. The book may seem rather boring, in which case you can try to look for alternative works that tell about cognitive distortions.
## Requirements and software architecture
- [Karl Wiegers - Software Requirements](https://www.amazon.com/Software-Requirements-Developer-Best-Practices/dp/0735679665)
The book will be useful for those who are busy collecting and working out software requirements. It will explain about how to interact with managers, customers and developers when collecting requirements, and how to turn verbal ideas into a technical solution with clear requirements and limitations.
- [Len Bass, Paul Clements, Rick Kazman - Software Architecture in Practice](https://www.amazon.com/Software-Architecture-Practice-SEI-Engineering/dp/0136886094)
A classic work on the basics of architectural approaches to software design. Contains a collection of classic architectural patterns and techniques for building large software systems.
- [Mark Richards, Neal Ford - Fundamentals of Software Architecture: An Engineering Approach](https://www.amazon.com/Fundamentals-Software-Architecture-Comprehensive-Characteristics/dp/1492043451)
The book is about the basics of software design. This book, like the previous one, also tells about the basics of design. The difference from the previous book is that this one offers to consider approaches to software design from an engineering point of view: the ability to achieve reliability, repeatability of system components, their predictability, etc.
- [Martin Fowler - Patterns of Enterprise Application Architecture](https://www.amazon.com/Patterns-Enterprise-Application-Architecture-Martin/dp/0321127420)
A set of architectural approaches for building various corporate systems. This book can be useful for those who build large corporate systems with varying degrees of complexity and focus: financial transactions, document management, etc.
- [Chris Richardson - Microservices Patterns](https://www.amazon.com/Microservices-Patterns-examples-Chris-Richardson/dp/1617294543)
The book focuses on the modern architectural approach of system design - microservices. This work will explain how to make a consistent transformation of an application from a "monolithic" state into a set of microservices. It contains a set of patterns, as well as tips for refactoring existing code in order to perform this procedure most effectively.
---
[**Go back**](Overview.md) | [**To main page**](../../README.md)

View File

@@ -1,40 +0,0 @@
# Community sources
## C++ General
- [CppReference](https://en.cppreference.com)
- [CPlusPlus](https://www.cplusplus.com/reference)
- [C++ Core Guidelines](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines)
- [Microsoft GSL C++ (Guidelines Support Library)](https://github.com/microsoft/GSL)
- [News from the C++ Standardization Committee](https://isocpp.org/)
- [C++ Online Compiler Explorer](https://gcc.godbolt.org)
## Popular C++ conferences
- [C++ Russia](https://cppconf.ru/)
- [Cpp Con](https://cppcon.org/)
- [Meeting C++](https://meetingcpp.com/)
- [C++ Now](https://cppnow.org/)
## C++ Conference YouTube Channels
- [C++ Russia](https://www.youtube.com/channel/UCJ9v015sPgEi0jJXe_zanjA)
- [Cpp Con](https://www.youtube.com/user/CppCon)
- [Meeting C++](https://www.youtube.com/user/MeetingCPP)
- [C++ Now](https://www.youtube.com/user/BoostCon)
## Alternative sources for learning C++
- [The ancestor of the roadmap idea](https://www.cjdb.com.au/sg20-and-videos.html)
- [Collection of various C++ resources](https://awesomecpp.com)
- [Cpp con (back to basics)](https://www.youtube.com/playlist?list=PLHTh1InhhwT5o3GwbFYy3sR7HDNRA353e)
- [C++ course for language basics](https://www.learncpp.com/)
## Other interesting repositories
- [A cheatsheet of modern C++ language and library features](https://github.com/AnthonyCalandra/modern-cpp-features)
- [Collection of libraries and frameworks for C++ ](https://github.com/fffaraz/awesome-cpp)
---
[**To main page**](../README.md)

View File

@@ -1,21 +0,0 @@
# C++ - It's Not Rocket Science
Modern C++ is much simpler than it is thought to be. The language has changed a lot during all the years of transformation, and gained the capabilities that allow writing safe and effective code. No need to think about memory leaks when using the primitives of the latest standards. The compiler has also become much smarter. It can apply a tremendous amount of optimizations to your code, delivering the maximum performance. It is still possible to optimize the code by manual tweaks and tricks, though.
The language has its shortcomings nonetheless. The main is the absence of a standard package manager. There is bunch of products that aspire to fill this niche, but as yet to no avail.
Also, C++ succumbed to its own paradigm: "The developer does not pay for what they do not use". In practice the developers of commercial software aren't too picky about the dependencies, which leads to the reverse situation: the developer pays each time they need a dependency. It leads to "interesting" side effects during the project build. Anyway, this problem is being solved gradually, too.
To get started with C++ one needs a basic set of school knowledge:
- Arithmetic;
- Boolean algebra;
- Drawing flowcharts;
- Number representation in different numeral systems.
Despite all the history behind C++ we believe that its modern version is much simpler that it used to be.
Don't be afraid to learn it and good luck!
---
[**To main page**](../README.md)

View File

@@ -1,32 +0,0 @@
# Junior C++
## Who is it?
It is a developer who has theoretical knowledge of software development and little practical experience in personal/educational projects. In addition, may have a theoretical understanding of how the industry works. Junior can perform simple tasks within a real project under the guidance of experienced colleagues.
## What coding abilities are expected?
- Ability to read documentation of libraries, frameworks, etc.
- Ability to collect and connect third-party libraries to the project
- Ability to read code from a different developer and understand it
- Search and fix bugs using the debugger or using logs
- Write tests to the code
- Basic knowledge and experience with Git
## What general skills are expected?
- Fast learning
- Ability to independently search for information on the Internet, books, etc.
- Ability to ask colleagues questions in a timely manner
- Ability to work in a team
## Tips and recommendations
- Try to find a couple of enthusiasts at your company and join them. They can be your source of knowledge and experience.
- Ask questions to senior colleagues. There are no stupid questions, there are stupid answers.
- Don't bury yourself in the task for too long. If after several attempts there is no progress, immediately contact your colleagues for help. They expect that the task will be completed by you within a reasonable period. Your main goal is to solve problems, not create them for the team.
- When difficulties arise, try to find a couple of possible solutions yourself, and then approach your mentor. Your mentor will adjust or complement your solution.
- Juniors tend to fall into a common trap: the more lines of code are written, the cooler they are as developers. Don't get caught! Remember, the more code you write, the higher the chance of an error. Ideally, the code should be written so that when you return to it six months later, you can quickly recall what it does. A good developer is not someone who writes a lot of code. A good developer behaves like a samurai: he delivers one precise and deadly blow, rather than pointlessly swinging his sword to hit the enemy.
---
[**Go back**](Overview.md) | [**To main page**](../../README.md)

View File

@@ -1,51 +0,0 @@
# Middle C++
## Who is it?
It's a developer that understands the technical context of development and has abilities to create a design and a solution for functionality that is a part of an application or component. The design also can be created even in case of an insufficient amount of requirements. This person also has a commercial experience background and is familiar with common business processes of development.
In general, the middle developer solves technical tasks. In comparison with a Junior, this person can do work without any help or minor assistance from a Senior/Lead engineer.
## What coding abilities are expected?
- A compiler and a programming language is not a "magic box" anymore. Any obstacles or surprises can be solved by generating hypothesis, validation, and confirmation/rejection.
- Understands foundation concepts of C++, knows about other languages, and can compare them with each other
- Writes readable, extendable, and maintainable code
- Knows design patterns and principles, can make technical decisions
- Understands the technical context of the language: e.g. how the code is compiled, knows the tools that help to maintain a code lifecycle:
- Code writing (IDE, text editors, code quality, best practices, etc.)
- Source code and product storage (version system control, package managers, servers, etc.)
- Compilation (compilers, build systems, libraries)
- Testing (frameworks, testing strategies)
- Shipment/Deployment
- Execution on a target system,
- Has more knowledge on Computer Science foundations (data structures, graphs, finite machines, algorithms)
## What general skills are expected?
- Can personally make decisions based on technical knowledge/background of a project
- Understands when a solution is "good enough" to prevent overengineering
- Has a team player mindset
- Can formulate and share an opinion with other teammates
- Has experience of work with different methodologies: Kanban, Agile/Scrum, Waterfall, etc.
- Helps other teammates
## Tips and recommendations
### Studying
- It's time to improve soft skills if you want to become a Senior developer. Technical expertise goes a bit behind and an ability to build dialogs and find compromises with others go first. A good developer is not the one who writes a lot of code but the one who understands how to solve a problem efficiently with minimal loses. It is better if you can solve a problem without any new code. It is ideal if you can even remove tens/hundreds lines of code.
- The middle role is most difficult for studying. You need to think not only about hard skills but also about soft skills and business-problem solving. It means you're asked to concentrate on both aspects simultaneously either about hard skills or soft skills.
- Good attention to soft-skills increases the probability to become a high-demand professional on the marker. You can try to grow as a highly specialized developer and ignore soft skills, but first - this kind of specialists are not often needed in business problems, second - competition among such kinds of developers is extremely high. If you're ready to compete with the best specialists on the market then don't listen to us and bravely go forward, but we still recommend thinking about skills diversity.
### Experience
- The main trap of many middle developers: they're "fanboys" of technologies, frameworks, design patterns, or methodologies. Try to be more pragmatic while solving tasks on your project. Don't try to intake all the newest ideas only to play with them or get "yet another skill" to your CV. The Middle role is a "pandora box" of overengineering or "diving" around frameworks.
- If you really think a library/framework is needed for a project - discuss it with a Senior or Lead engineer first. Propose them to create a "proof of concept" where you will be able to check all hypotheses in action before intake a new dependency. Please, don't try to do it in secret from your team! It's fun for you, but it's a "disaster" for your team in the future. It increases maintenance costs and might bring unforeseen consequences.
---
[**Go back**](Overview.md) | [**To main page**](../../README.md)

View File

@@ -1,26 +0,0 @@
# Developers grading
> Grading - it's an approach to classify developers by their set of skills and experience. By means of grading it's possible to understand how to differentiate tasks difficulty with an expected set of skills to deal with it.
Nowadays, you can meet the following common grading approach. It is possible to mark the following levels:
- Junior;
- Middle;
- Senior.
Each company has its own vision of developers grading and a set of skills/responsibilities declared for different levels. It's really simple to meet the following case: you will be promoted as a senior in a first company, but if you go to another one you will be assessed as a middle. Despite all, it's possible to introduce common expectations for each level. We will use a simplified approach declared before to describe each grade.
**Example:** You can check this website to get knowledge about leveling systems in different companies: https://www.levels.fyi/
![](https://github.com/Salmer/CppDeveloperRoadmap/blob/main/Russian/Grades/Source/GradeTable.PNG?raw=true "GradeTable")
## Level Descriptions
You can read these articles to get understanding about each level, and its common expectations:
- [Pre-Junior C++](PreJunior.md)
- [Junior C++](Junior.md)
- [Middle C++](Middle.md)
- [Senior C++](Senior.md)
---
[**To main page**](../../README.md)

View File

@@ -1,47 +0,0 @@
# Pre-Junior C++
## Who is it?
It is someone who is familiar the syntax of the language and can write a simple program without third-party libraries. The program performs simple procedures such as:
- arithmetic operations
- file manipulation: either reading or writing
- wait for the keyboard input
- display the result or other data in the console
- etc.
## What coding abilities are expected?
- Create and build a small working C++ project using one of the IDEs: Visual Studio, Qt Creator, etc.
- Use a debugger via the IDE
- Understand the compilation and linking process of a C++ program
- Write an application making use of arithmetic and logical operations, conditionals, and loops
- Write an application using the standard input/output streams
- Manipulate pointers and references
- Know the types of memory used in an application
- Understand basic OOP in the frame of C++: inheritance, polymorphism, encapsulation
## What general skills are expected?
- Desire to learn and acquire new knowledge
- Desire to solve encountered problems
- Ability to compose a query to find the solution to a problem using a search engine or the corresponding literature
## Tips and recommendations
### Studying
- There is no silver bullet to help you learn C++ in one day/week/month. Get ready for the lengthy unsupervised learning of all kinds of material before you are able to pass the interview to get your first job offer.
- If you feel that you don't understand some topic, look for alternative sources.
- Practice and only practice will let you harness C++! You'll forget most of what you read or hear without regular coding.
- Don't try to write perfect code. Your main goal is to write a pile of code that WORKS, i.e. does exactly what is required. You need to learn to communicate with the computer. It's similar to studying foreign languages. First you talk sloppily, but then you refine your skills, you get a better feel of the grammar, you expand your vocabulary, and so on.
- Don't jump at a huge problem at once - like creating your own game. In the beginning you are likely to lack the knowledge and experience to cope with the task alone. This approach frustrates quickly and leads to the disappointment in oneself and one's abilities, forcing to abandon education. Better progress from simple to complicated, gradually inventing more and more difficult tasks for yourself.
- Don't focus on Leetcode and Codewars and other similar resources at first. The purpose of these portals is to refine the skill of the application of classic algorithms and data structures. These playgrounds are designed to abstract away the details of the programming languages. This won't benefit you considerably in the beginning, it's better to focus on the language itself and its capabilities.
### English language
- It's easier to look for the solutions in English, but don't torture yourself if your current language proficiency isn't high enough. You might get demotivated too soon. Most of the problems you are likely to encounter in the beginning are searchable in your native language.
- If you feel that your English is insufficient, start studying it through the use of simpler and more pleasant means: series, video games, fiction, news outlets or articles you're interested in. Several months are enough to refine your skill of English comprehension.
---
[**Go back**](Overview.md) | [**To main page**](../../README.md)

View File

@@ -1,26 +0,0 @@
# Senior C++
## Who is it?
It is a developer who understands not only the technical, but also the business context and is able to create a design and solution for a component/application/system taking them into account. In addition, Senior helps other team members to grow and follows the technical trends of the development world.
## What coding abilities are expected?
- Able to translate tasks from business language to development language and decompose tasks
- Able to conduct a dialogue with the business and explain technical details and difficulties to people outside the team
- Able to not only make a design decision, but also create a component/application architecture
- Understands and uses architectural principles
## What general skills are expected?
- High communication skill
- Able to independently collect requirements, if necessary
- Helps develop team members
## Tips and recommendations
Depending on the specifics of the company and on your desires, the path of further development lies either in the learning of recent technologies and technical skills required in your chosen field of knowledge (for example, special sections of mathematics, physics, etc. - the path of a technical expert), or in the field of management and interaction with people (tech lead, team lead, PM, etc.). Choose wisely. 🙂
---
[**Go back**](Overview.md) | [**To main page**](../../README.md)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

View File

@@ -1,7 +0,0 @@
# How to view and modify the roadmap in graphML format
GraphML — is an XML-based file format for graphs. It is supported by many applications for viewing it.
For example, you can use [yEd](https://www.yworks.com/products/yed) to view graphML file and modify it as you want.
![](./example.png)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 444 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 520 KiB

View File

@@ -1,40 +0,0 @@
# How to study?
The main thing that can be advised is that you should understand that only you are responsible for your development. Of course, you will find many enthusiasts around who will be happy to help you with advice, but no one will produce specific tasks or training programs for you. The best friend in this business is you, Google search, and the tutorials.
## How to study new C++ 11/14/17/20 standards?
Beginners can be advised not to focus too much on standards at the beginning of their journey. Pick up books from the [Beginner's List](Books/PreJunior.md) and learn the fundamentals. Modern books for beginners contain little information about the capabilities of the C++ 11 and newer standards. At first, you should not focus on the new language standards.
A natural question arises: "Why is it like that?" It is like that because modern standards are focused on three main things:
- fixing issues
- syntactic sugar
- new functionality
If with fixing problems and with syntactic sugar everything is obvious (in the first case, new constructions are introduced that correct the problems of old standards, and in the second, new abstractions appear that simplify writing repetitive code and so on), then with new functionality it's a bit more complicated.
C++ develops in the same way as all other languages: it takes some popular idea from computer science or a successful feature from other languages and introduces it into the language. It is important to study such constructs and use them, if necessary, but in the beginning it is necessary to study the foundations that were created by the older standards (C++11/C++14). They are described in most modern books for beginners.
## Where to get an overview of the latest C++ standards features?
- Presentations among [C++ conferences](CommunitySources.md)
- On the main page of the [CppReference](https://en.cppreference.com/w/cpp) you will find links to pages with overview lists of the newest features
- You can read the following book by [Bjarne Stroustrup - A Tour of C++](https://www.amazon.com/Tour-2nd-Depth-Bjarne-Stroustrup/dp/0134997832). Regularly check the book republication as it's updated when a new C++ standard is released
- Professional forums/chats/discussions/etc.
- Overview videos on YouTube by community
- [A cheatsheet of modern C++ language and library features](https://github.com/AnthonyCalandra/modern-cpp-features)
## Training recommendations
- Learn at your own pace and at any age! Do not get fooled by stories: "I'm a programmer from the cradle". Most of these stories are [survivorship bias](https://en.wikipedia.org/wiki/Survivorship_bias) or an attempt to flatter their vanity at your expense. You have enough ability to learn programming from scratch including C++!
- Most of the problems you run into are likely already solved. If you cannot find the answer on the Internet, try reformulating your request in a different way. Eventually, you will come to the right answer. If the answer still didn't come, then try to solve the problem in a simpler way.
- Remember, you should be learning the language at first and not struggling with the work environment instead. Fighting with the environment can lead to complete frustration and loss of motivation.
- Remember that many experienced developers run into problems too and can get stuck in "obvious" places. Just take a break, do something else, and then return to the task after a break.
- Find like-minded people who are also starting their learning path. So, it will be more interesting for you to immerse yourself in learning the language together as well as share knowledge and experience with each other. It will also help to develop teamwork skills. The days of "free artists" have ended. Almost everywhere you will have to work as a team.
- Try to find yourself an experienced mentor. Under his guidance, you will be able to avoid various typical traps and wasted time on them.
---
[**To main page**](../README.md)

View File

@@ -1,49 +0,0 @@
# Myths and Legends of C++
## C++ is dead, it's impossible to code anything with it
C++'s not dead.
C++ made its way to the top of a wide range of ratings of programming languages, and it is scoring, moreover, popularity points, for example in the [Tiobe](https://www.tiobe.com/tiobe-index/) index. C++ got its notorious "dead language" badge during the noughties, while it was dormant and the language standardization committee fell off the radar. But the language is experiencing a renaissance since the C++11 standard. It is arduously getting new features and functionality, every three years. Many problems claimed by the "dead C++ witnesses" have been solved, but since such specialists have stopped developing using C++ - or got a smattering of C++ during courses (from those very "witnesses") - they continue repeating and reiterating the myths and legends of the horrors of C++.
## Real programmers learn C++ using Linux/Vim/gcc
If you are unfamiliar with the aforementioned combo, we recommend you concentrate on learning the basics of C++ alone. We also suggest you start developing your first applications using Microsoft Visual Studio IDE (see [PreJunior Books](Books/PreJunior.md) for the details).
Choosing the hard way looks cool, but there is a high chance that the volume of the information needed to build the "Hello World" using Linux + Vim + gcc would be overwhelming. It is fraught with an early frustration and disaffection with programming as a whole. Try to follow the path from simple to complicated. Novices don't try to lift the heaviest weights during the first workout because they know what it might lead to. The same rule applies to education. You can try developing under Linux once you are comfortable with the language. But it's a different story altogether...
## You'd better master C/Assembler/etc. before learning C++
No, no, and no again!
This statement continues to live due to two widespread scenarios: it's how they used to teach in the university, and the members of the "Old Guard" went through a similar path. Modern C++ doesn't require such torture. This language is self-sufficient and can be learned with no background whatsoever. It's more likely that learning the "C -> C++" way you get a mess in your head and a firm desire to write C++ in the "C with classes" style.
## Learn C++ using the book by Stroustrup
A highly damaging thesis taking origin from the "Old Guard" or someone born with a keyboard in hand.
Those who had extensive experience of development in other languages (C, Fortran, Delphi, etc.) and transitioned to C++ are most likely to give this piece of advice. Stroustrup wrote this book like a reference ([The C++ Programming Language](https://www.amazon.com/C-Programming-Language-4th/dp/0321563840)), therefore one needs to use it in the appropriate manner, which requires some knowledge of the language. Better look at the [Books](Books/Overview.md) section, you'll find books for any level of language proficiency.
## Learn C++ using the Standard only
Another snobbish statement.
First, the modern C++ standard exceeds 2000 pages. Secondly, the access to the up-to-date version requires payment. Thirdly, the standard isn't composed in a friendly way. Those who learned the language using its standard can be pat on the back, but we do not recommend abusing oneself this way. Once again, better look at the [Books](Books/Overview.md) section, you'll find books for any level of language proficiency.
## Undefined Behavior haunts the developer everywhere
More likely no than yes.
Modern C++ and the tooling emerged around the language allow to avoid the lion's share of the problems related to the undefined behavior. We can give a rather simple piece of advice: when hesitant what a particular construct does, read about it on [CppReference](https://en.cppreference.com), [StackOverflow](https://stackoverflow.com/) or other dedicated resources. If still in doubt after the reading, try rewriting the code in a simpler manner to avoid the undefined behavior. In simplicity there lies a great power.
## One needs to manage memory manually, there is no garbage collection in the language
This is another urban legend from the "Old Guard" that had stopped writing C++ before C++11 or those who superficially learned it in university disregarding the latest standards. Modern C++ contains a set of primitives in its standard library which are responsible for the automatic memory allocation and deallocation. The manual memory management fell by the wayside. Many teams and companies even have the rule: "No raw pointers". Once again, do not neglect the modern tools and sanitizers: they can detect possible memory leaks at the source code level.
## C++ is legacy area only
Partially it's true, but it's good to note that it's applicable for other languages. Even with a modern stack, developers can produce code that will become legacy very fast. The code quality mainly depends on the technical culture of a team and its pioneers, not a language. The majority amount of legacy code is produced under the human factor: developer's grade and skill set, work ethic, wrong estimations, etc. Nowadays, you can meet a lot of projects working 24/7 for years and written in C++. Such kinds of systems are often the business foundation of revenue. In this case, it's really dangerous to perform any huge changes in short time. The developers make any changes with high attention to any regression. But don't think that legacy projects can not help you to improve yourself. In fact, these projects can give you a challenge that can bring you widespread experience in different areas: code reading, reverse-engineering, testing, designing of SW architecture, automation, requirements gathering, etc.
---
[**To main page**](../README.md)

View File

@@ -1,73 +0,0 @@
# Pet-projects
The pet-projects are a great chance to gain hands-on experience when learning a programming language or libraries and/or frameworks. The pet-projects can also become a starting point for interviews and an invitation to dialogue if you start your career.
There are often difficulties with finding and choosing the idea of a pet-project. We tried to put together a small collection of links and ideas that can be a start for your inspiration. After reading it, you will be able to choose the most suitable idea or it will inspire you to some idea of your own!
## External links
* [Google Summer of Code](https://summerofcode.withgoogle.com/archive)
A collection of projects that were offered by various companies or the community as part of the annual student internship program from Google. The archive contains projects from the last few years. A large number of projects for the C++ language are presented. Perhaps you will find something interesting for yourself in the archive for practice, or try your hand at future internships.
* [Project based learning - C++](https://github.com/practical-tutorials/project-based-learning#cc)
The repository contains a collection of pet projects collected for various programming languages. Also includes an extensive list of ideas for C++.
* [Programming challenges](https://programming-challenges.jeremyjaydan.dev/) - [PNG image](https://programming-challenges.jeremyjaydan.dev/media/programming-challenges-v4.0.png)
Roulette with ideas for pet projects. You set up the expected complexity of the project and run the roulette. Then randomness will decide for you what task you will have to solve :)
## The list of pet-project ideas
### Games
Below is a list of classic video games that do not contain complex AI or dynamic world generation. You can implement one of the following games, and then refine additional functionality. As a graphics library, you can use [SFML](https://www.sfml-dev.org/). This is an easy-to-use library that provides a sufficient set of features for creating simple graphical interfaces for 2D or 2.5D games using [sprites](https://en.wikipedia.org/wiki/Sprite_(computer_graphics)). If you want to do something more complex where physics is applied, you can start with simple engines, for example: [Box2D](https://box2d.org/) or learn more advanced ones: [Cocos2D](https://www.cocos.com/en/), [Unreal Engine](https://www.unrealengine.com/en-US/) etc. Don't forget about the rule: "from simple to complex." Start with a simple one, and gradually increase the difficulty.
* [Snake](https://en.wikipedia.org/wiki/Snake_(video_game_genre))
* [Tetris](https://en.wikipedia.org/wiki/Tetris)
* [Game of Life](https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life)
* [15 puzzle](https://en.wikipedia.org/wiki/15_puzzle)
* [Arkanoid](https://en.wikipedia.org/wiki/Arkanoid)
* [Minesweeper ](https://en.wikipedia.org/wiki/Minesweeper_(video_game))
* [2048](https://en.wikipedia.org/wiki/2048_(video_game))
* [Solitaire](https://en.wikipedia.org/wiki/Solitaire)
* [Spider Solitaire](https://en.wikipedia.org/wiki/Spider_(solitaire))
* [Ping-pong](https://en.wikipedia.org/wiki/Pong)
* [Donkey Kong](https://en.wikipedia.org/wiki/Donkey_Kong_(video_game))
* [Labyrinth](https://en.wikipedia.org/wiki/Labyrinth:_The_Computer_Game)
* [Network games for 2-4 players: ping-pong, poker, chess, battleships, etc.](https://en.wikipedia.org/wiki/Online_game)
It's recommended reading the following sources, which contain more information about various algorithms for gamedev. They can be useful for one of the above games, or for your own ideas:
* https://www.redblobgames.com/
* http://www.squidi.net/three/
---
### Applications
When creating an application, start with the simplest implementation of a console application. After each completed step, set a more complex task, for example: add a graphical interface for the application, teach the application to request data from the source using an http request, and then write/read the received data to a test file/database, etc. Do not forget about the principle: "from simple to complex."
* Network chat (raw sockets or using [gRPC](https://grpc.io/docs/languages/cpp/quickstart))
* Calculator
* File Manager
* Currency Converter
* Getting a list of "Pull-Requests" or "Issues" in any Github repository
* Routine automation: various calculations and generation of reports in the form of tables
---
### Student applications
The following examples are more suitable for students who are passing or recently passed basic disciplines: linear algebra, analytical geometry, mathematical analysis, physics, etc. Tasks for the application of the studied theory will help to simultaneously "catch two birds with one stone": to consolidate the studied theory in practice and to practice programming. This path is not closed to others, but it is obviously easier for students, because knowledge of academic disciplines is still fresh.
* Linear algebra library: matrices, vectors, calculations, etc.
* Modeling of various processes: physics, theoretical mechanics, etc.
* Application of numerical methods: integration, differentiation, approximation, interpolation, etc.
---
[**To main page**](../README.md)

View File

@@ -1 +0,0 @@
Original README has moved to main page: [go to original page](https://github.com/salmer/CppDeveloperRoadmap)

View File

@@ -1,15 +0,0 @@
# Why and what for the roadmap has been created?
C++ is actively used in many commercial projects. Throughout its history the language has undergone big changes. It made C++ much more convenient for day-to-day use. But a lot of speculation, myths and fears still hover around the language to scare off a large number of people who want to learn it. Our goal is to help beginners dispel the myths about the complexity of C++ and to help them to find their way to learn the language.
There is a shortage of developers in the market that can write in C++. Based on our experience, it seems that many active developers have learned the language because they had a very strong desire to learn it and not because it was easy to find information about the language. It is not often that you come across a person who has mastered C++ exclusively through training programs. A large proportion of educational platforms or courses cannot offer high-quality lessons: either a very high-level and abstract course is offered, or a course is simply outdated and is not relevant anymore. That is not enough to start successfully completing tasks in commercial projects.
The entry barrier into C++ development is still higher compared to other languages. Most of the available information targets active developers. This fuels myths about the exceptional complexity of the language. There is an extreme lack of relevant information for beginners.
This roadmap tries to fill the gap that has been formed. The idea of creation arose after a large number of interviews with inexperienced candidates for the position of a C++ developer. They showed common patterns: gaps in basic knowledge, lack of understanding on how to learn the language and where to get the knowledge from.
Also, the map can be useful for those who have already been practicing using C++ for some time in personal and work projects. It can help you to understand what knowledge you are lacking to deepen the level of language proficiency, as well as become a highly qualified specialist.
---
[**To main page**](../README.md)

View File

@@ -1,21 +0,0 @@
# Are you sure that you need C++?
The first thing about which you should really think is: Why do you need to learn C++?
The language has specific areas of application. Try to search and dive into them before you start exploring C++. Find the one that interests you, take a close look and it might be that the real situation will be different from your expectations. Here are some examples why it is worth to do it beforehand:
- Some development areas look different from their idealized image. Game development is a good example. Alongside with known advantages it has many dark sides: crunches, lack of intelligible management, work for the drawer, etc.
- It might be that in the area that you are interested in a different language might be popular. For example, in machine learning, the most common language is Python and specialized libraries for it.
# I already know C/C#/Java/Python and so on. Can I already start to work using C++?
Yes and no. :)
Computer science basics will help you for sure. For example, understanding procedural programming, OOP or other concepts and general knowledge. But you shouldn't rely on them completely. The most common case that newbies often find themselves in is that they try to write in C++ in the paradigms of other languages. For example, C developers tend to write C++ programs in procedural style, or they tend to think that C++ is "C with classes".
C++ is rich in ideas and coding approaches. Therefore, it is recommended to start learning the language with a clean head. Understand its ideas. This will help you to use the language effectively in your work tasks. Knowledge of other languages will help you compare them with each other and identify strengths and weaknesses.
---
[**To main page**](../README.md)

View File

@@ -1,170 +0,0 @@
# Language toolkit
Newborn developers have a limited understanding of the tools available, which make it easier to work with code, as well as increase efficiency and protect against many mistakes. All these tools are not a silver bullet for difficulties that language has for you, but they significantly smooth out the corners. Below is a list of common and popular tools recognized by developers around the world. This list is only a small part of the available tools. Over time, you will begin to better navigate them and find something new for yourself.
## Text editors
* **Visual Studio Code**
Site: https://code.visualstudio.com/
Price: free
Powerful and efficient editor for text files and source code. Has a rich library of extensions that will allow you to customize it for yourself. It is also possible to customize it to work with source code: compile, run and debug. It has a powerful search engine for files and folders, which increases the efficiency of searching, reading and working with large projects.
* **Notepad++**
Site: https://notepad-plus-plus.org/
Price: free
Lightweight editor for text files and source code. Supports syntax and highlighting of common programming languages. Compared to Visual Studio Code, it is convenient to use for quickly opening and viewing files. Due to its lightness, it is comfortable to work with a large number of text files.
## IDE (Integrated Development Environment)
* **Microsoft Visual Studio IDE**
Site: https://visualstudio.microsoft.com
Price: Community Edition is free
Integrated development environment from Microsoft. Provides all the necessary set of tools (code editor, compiler, debugger, profiler, etc.) out of the box. Supports development in various programming languages as well as cross-platform development. A great start for newbies as the modern interface of the studio is as friendly as possible, and practically does not require any adjustment out of the box.
* **Qt Creator IDE**
Site: https://www.qt.io/product/development-tools
Price: free for open source projects (more details: [Qt Open Source](https://www.qt.io/download-open-source?hsCtaTracking=9f6a2170-a938-42df-a8e2-a9f0b1d6cdce%7C6cb0de4f-9bb5-4778-ab02-bfb62735f3e5))
Initially, Qt Creator was positioned as an IDE for developing graphical interfaces for applications in C++. But over the time, the framework has acquired tremendous opportunities. As a result, the framework has grown into a full-fledged ecosystem for developing cross-platform applications. It provides a large library of primitives for various needs: networking, graphical interface, database work, work with popular formats: images, text files, etc. Modern Qt Creator acts as a competitor for Visual Studio, but mostly it has gained developers who develop applications for various Linux distributions.
* **Eclipse IDE**
Site: https://www.eclipse.org/downloads/packages
Price: free
Quite a powerful multi-platform development environment, but at the same time heavyweight. A key feature of Eclipse is modularity. The philosophy of Eclipse is that any developer can modify the development environment for himself by connecting additional extensions. Taken as a basis by some compiler developers for specialized OS or microcontrollers (for example: QNX real-time OS).
* **JetBrains Clion IDE**
Site: https://www.jetbrains.com/clion
Price: free for students and teachers
Powerful multiplatform IDE from Russian company JetBrains. Like other IDEs, it contains a complete set of tools for comfortable software development. Convenient for cross-platform development in both C and C++.
## Extensions
* **JetBrains ReSharper C++**
Site: https://www.jetbrains.com/resharper-cpp
Price: free for students and teachers
Extension for MS Visual Studio. Adds additional features for working with source code: extended highlighting of the code and hints on it, building dependency diagrams between projects, recommendations on common errors in the code and how to improve it, extended information during debugging, advanced search, project navigation, etc. It is a competitor to Visual Assist.
* **Visual Assist**
Site: https://www.wholetomato.com
Extension for MS Visual Studio. Adds additional features for working with source code: extended code highlighting and hints on it, extended information during debugging or when writing code, advanced search, project navigation, etc. It is a competitor to JetBrains ReSharper.
* **Incredibuild**
Site: https://www.incredibuild.com
Price: have to contact incredibuild team to find the price
Application/extension for distributed compilation of projects. It unites all dev workstations into a single network which provides a possibility to use dozens of machines to assemble and compile the source code. This allows you to speed up the build of large projects.
## Package managers and build systems
* **Cmake**
Site: https://cmake.org
A cross-platform automation system for building an application from source code. Generates the necessary artifacts for the subsequent assembly of the application on the target platform. It is currently considered the "standard" tool for building various libraries when supplied as source.
* **Conan**
Site: https://conan.io
Price: free
A package manager as well as a dependency manager for organizing C++ libraries and frameworks. Supports work with various platforms: Windows, Linux, etc. Supports integration with CMake, Visual Studio, etc.
* **Ninja**
Site: https://ninja-build.org
Price: free
Project build manager for C and C++ applications. The main advantages that this manager claims: quick project assembly. Supports cross-platform development, supports all popular compilers.
## Code analyzers
* **PVS Studio**
Site: https://pvs-studio.com
Price: 30 days trial
Cross-platform (Windows, Linux, MacOS) static code analyzer from the Russian company PVS-Studio. The main task of the analyzer is to analyze the source code for various errors that are not detected by compilers or at the stage of code review. It helps to minimize number of errors associated with the syntactic structures of the language and their pitfalls.
* **Cpp Check**
Site: https://cppcheck.sourceforge.io
Price: free
Free code analyzer. It will help you catch common errors by analyzing the source code, which may be missed by the compiler or during the code review process. Cross-platform, supports popular Linux distributions and Windows.
* **Valgrind**
Site: https://www.valgrind.org
Price: free
A set of tools that can help you investigate a variety of problems while the application is running: memory leaks, brake profiling, etc. It suits various Linux distributions.
## Git clients
* **SmartGit**
Site: https://www.syntevo.com/smartgit/
Price: free for open source projects
A complete cross-platform tool for working with git repositories. Out of the box, it provides the following features: receiving/sending changes to the repository, viewing the history of changes, a text editor for resolving conflicts, etc. Supports integration with all popular repositories: GitHub, BitBucket, GitLab, etc.
* **Atlassian SourceTree**
Site: https://www.sourcetreeapp.com/
Price: free
A great free alternative for working with git using GUI. Has the same functionality as SmartGit. The only exception is absence of its own editor for conflict resolution. But this can be easily fixed by integrating Visual Code or any other editor that can compare files with each other. In all other respects, it completely duplicates the functionality of SmartGit: cross-platform, supports integration with public repositories: GitHub, BitBucket, GitLab, etc.
* **Git Kraken**
Site: https://www.gitkraken.com/
Price: free for open source projects
Cross-platform and highly efficient client for Windows, Linux, MacOS. Supports integration with GitHub, Bitbucket and Gitlab, as well as all the necessary functionality for everyday work: studying the history of changes, receiving/submitting changes, switching between branches, built-in conflict resolution editor, etc.
---
[**To main page**](../README.md)