{"id":50687369,"url":"https://github.com/amaargiru/pyroad","last_synced_at":"2026-06-25T23:00:48.196Z","repository":{"id":63722864,"uuid":"561290306","full_name":"amaargiru/pyroad","owner":"amaargiru","description":"Highly detailed Python developer roadmap","archived":false,"fork":false,"pushed_at":"2025-07-24T11:12:11.000Z","size":10734,"stargazers_count":334,"open_issues_count":2,"forks_count":38,"subscribers_count":8,"default_branch":"main","last_synced_at":"2025-07-24T15:47:30.767Z","etag":null,"topics":["python","roadmap","tutorial"],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/amaargiru.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"license","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-11-03T11:26:31.000Z","updated_at":"2025-07-24T11:12:15.000Z","dependencies_parsed_at":"2025-07-24T13:23:40.089Z","dependency_job_id":null,"html_url":"https://github.com/amaargiru/pyroad","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/amaargiru/pyroad","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amaargiru%2Fpyroad","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amaargiru%2Fpyroad/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amaargiru%2Fpyroad/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amaargiru%2Fpyroad/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/amaargiru","download_url":"https://codeload.github.com/amaargiru/pyroad/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amaargiru%2Fpyroad/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34795436,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-25T02:00:05.521Z","response_time":101,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["python","roadmap","tutorial"],"created_at":"2026-06-09T00:00:33.889Z","updated_at":"2026-06-25T23:00:48.176Z","avatar_url":"https://github.com/amaargiru.png","language":"Jupyter Notebook","funding_links":[],"categories":["Jupyter Notebook"],"sub_categories":[],"readme":"## Detailed Python developer roadmap\r\n\r\n![Finding Python](https://raw.githubusercontent.com/amaargiru/pyroad/main/pics_jpg/header.jpeg)  \r\n\r\nHello! My name is Mikhail Emelyanov, I am embedded software engineer, and I was inspired to write this little roadmap on the capabilities of Python language by a certain commonality among the existing Python tutorials found on the web.\r\n\r\nThe usual suggestions to study, say, “Algorithms and Data Structures” or “Databases” are especially jarring. You can spend years studying these topics, and even after decades you'd still be able to find something you didn't know yet even without ever venturing outside the scope of Algorithms!\r\n\r\nUsing video game analogies, we can say that novice programmers often stand on the shore of the lake of boiling lava with an island with the ever-coveted jobs in the center, while the islands in between, which you have to jump on, gradually increasing your skills in successive mini-quests, are either missing, or arranged haphazardly, or their fairly smooth sequence breaks off, never having managed to get you any farther from the shore. Let's try to build a path of hint islands, a number of which, although not without effort, will finally allow us to reach our goal.\r\n\r\nThe roadmap is very easy to use. Just as you would in a normal text, go from left to right and from top to bottom. If you're just starting to learn Python, follow the green sections of the roadmap. If your accumulated experience, curiosity, or necessity pushes you deeper, start exploring the sections marked in gray. Orange marks the topics that require in-depth study, those are better to tackle (at least without digging especially deep to begin with) on the third pass.\r\n\r\nThis article definitely contains mistakes and inaccuracies of different calibers, and of course, many required subsections are missing; so, if you notice any of these, feel free to comment, and if you feel the Force, you're welcome to fork the [GitHub repository](https://github.com/amaargiru/pyroad) with the roadmap's source code and contribute whatever you feel is necessary; all corrections and additions are strongly encouraged. It also contains all the parts of the map in [Mermaid](https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/) diagram format, as well as png/svg illustrations.\r\n\r\nWhen diving into Python, don't forget the excellent official documentation at [docs.python.org](https://docs.python.org/). By studying it, at least in brief, and gradually reading deeper into the right sections, you will be able to see that many of the “hacks”, “findings” and other obscure matters have long since been considered, described and have detailed examples of use.\r\n\r\nI would also recommend [leetcode.com](https://leetcode.com/problemset/all/?difficulty=EASY\u0026page=1\u0026status=NOT_STARTED) for learning basic Python syntax to the fullest extent. If you filter the tasks by “Easy” level, and then add an additional sorting by the “Acceptance” column, you'll be presented with a straightforward primer with smoothly increasing task difficulty, rather than the intimidating competitive platform.\r\n\r\nWell, that’s enough stalling for the moment. Let's get started! \r\n## Data Structures\r\n\r\nAs a reminder, if you are a novice developer, go from left to right through the entries marked in green. Create instances of each type, try adding and removing elements, and experiment with them via the debugger. See how big the resulting objects are, and try to figure out why list and array containing the same data are different in size. Study the features of each type, read and figure out which data structure will work best for which tasks.\r\n\r\nDon't forget that this is just a guide, a table of contents for a book that you will have to write yourself. Actively seek information on the web, consult sources and official documentation. Dive [Stackoverflow](https://stackoverflow.com/) just for fun, there's plenty of exciting reading there!\r\n\r\nIf you start to make progress, move on to the next section, and don't feel bad if you can't. Don't envision your mind as the sword of Alexander the Great cutting the Gordian knot in one fluid, precise move, worthy of Instagram's front page. Be as a carpenter’s plane, stripping away one thin layer at a time, and sooner or later the misunderstanding will go away, even if this seems to you to be a chasm ten thousand leagues deep.\r\n\r\n```mermaid\r\nflowchart TD\r\n\r\nsubgraph Data_Structures\r\ndirection LR\r\nList(list) -.-\u003e Tuple -.-\u003e Dict -.-\u003e Set -.-\u003e Array -.-\u003e Linked_List -.-\u003eTree -.-\u003e Python_specific_data_structures\r\n\r\nsubgraph Tuple\r\ndirection LR\r\ntuple(tuple)\r\nnamedtuple(namedtuple)\r\nend\r\n\r\nsubgraph Dict\r\ndirection LR\r\ndict(dict)\r\nHashProblem(\"Hash collisions\")\r\ndefaultdict(defaultdict)\r\nCounter(Counter)\r\nend\r\n\r\nsubgraph Set\r\ndirection LR\r\nset(set)\r\nFrozenSet(\"frozen set\")\r\nend\r\n\r\nsubgraph Array\r\ndirection LR\r\narray(array)\r\nbytes(bytes)\r\nbytearray(bytearray)\r\nend\r\n\r\nsubgraph Linked_List\r\ndirection LR\r\nSinglyLinkedList(\"Singly linked list\")\r\nsubgraph Doubly_Linked_List\r\ndirection LR\r\ndeque(deque)\r\nQueue(Queue)\r\nend\r\nend\r\n\r\nsubgraph Tree\r\ndirection LR\r\ntree(\"Binary tree\")\r\nheap(heap)\r\nB-tree(B-tree)\r\nRedBlackTree(\"Red–black tree\")\r\nAVLTree(\"AVL tree\")\r\ntrie(trie)\r\nend\r\n\r\nsubgraph Python_specific_data_structures\r\ndirection LR\r\nenum(enum)\r\nrange(range)\r\ndataclass(dataclass)\r\nstruct(struct)\r\nstring(string)\r\ndatetime(datetime)\r\nend\r\nend\r\n\r\nclassDef trainee fill:#6ADA6A, stroke-width:3px\r\n\r\nclass List trainee;\r\nclass tuple trainee;\r\nclass dict trainee;\r\nclass set trainee;\r\nclass array trainee;\r\nclass bytes trainee;\r\nclass deque trainee;\r\nclass heap trainee;\r\nclass range trainee;\r\nclass string trainee;\r\nclass datetime trainee;\r\n```\r\n## Data Management\r\n\r\nTry to manipulate your data, feel how you can mold anything you want out of this malleable clay. Try creating a data structure with many elements (a million, for example), sort them, quickly find the values you want with bisect, and write the results in a JSON file.\r\n\r\nIf everything goes according to plan, try to dig into the less obvious topics: apply regex to solve some simple task or save previously obtained data in Pickle format, understanding the reason for binary file formats after observing the size of the resulting files.\r\n\r\nThis is where you will find the first entries marked in orange. Google what TensorFlow and Keras are and what tasks they solve. Perhaps, this could be your future job, your vocation!\r\n\r\n```mermaid\r\nflowchart TD\r\n\r\nsubgraph Data_Management\r\ndirection LR\r\nslice(slice) -.-\u003e Sorting -.-\u003e Comprehension -.-\u003e String_Management -.-\u003e Datetime_Management -.-\u003e bisect(bisect) -.-\u003e Functools -.-\u003eFile -.-\u003e Data_Analysis -.-\u003e Neural_Networks\r\nsubgraph Sorting\r\ndirection LR\r\nsort(sort)\r\nsorted(sorted)\r\nend\r\n\r\nsubgraph Comprehension\r\ndirection LR\r\nlistcomprehension(list)\r\ndictcomprehension(dict)\r\nsetcomprehension(set)\r\nend\r\n\r\nsubgraph String_Management\r\ndirection LR\r\nString_Built-in_Functions(\"Built-in functions\")\r\nregex(regex)\r\nend\r\n\r\nsubgraph Datetime_Management\r\ndirection LR\r\nencode(encode)\r\ndecode(decode)\r\ndtmath(math)\r\nend\r\n\r\nsubgraph Functools\r\ndirection LR\r\nfmap(map)\r\nffilter(filter)\r\nfreduce(reduce)\r\nfpartial(partial)\r\nfmore(...)\r\nend\r\n\r\nsubgraph File\r\ndirection LR\r\nRead_Write(\"read/write\")\r\nText_Binary(\"text/binary\")\r\nJSON(JSON)\r\nPickle(\"Pickle\")\r\nProtocol_Buffers(\"Protocol Buffers\")\r\npaths(paths)\r\nend\r\n\r\nsubgraph Data_Analysis\r\ndirection LR\r\nData_Built-in_Functions(\"Built-in functions\")\r\nNumPy(NumPy)\r\nPandas(Pandas)\r\nMatplotlib_Seaborn(\"Matplotlib/Seaborn\")\r\nend\r\n\r\nsubgraph Neural_Networks\r\ndirection LR\r\nPyTorch(PyTorch)\r\nTensorFlow(\"TensorFlow/Keras\")\r\nend\r\n\r\nend\r\n\r\nclassDef trainee fill:#6ADA6A, stroke-width:3px\r\nclassDef middle fill:#FF9900, stroke-width:3px\r\n\r\nclass slice trainee;\r\nclass sort trainee;\r\nclass sorted trainee;\r\nclass listcomprehension trainee;\r\nclass bisect trainee;\r\nclass fmap trainee;\r\nclass ffilter trainee;\r\nclass freduce trainee;\r\nclass String_Built-in_Functions trainee;\r\nclass encode trainee;\r\nclass decode trainee;\r\nclass Read_Write trainee;\r\nclass Text_Binary trainee;\r\nclass JSON trainee;\r\nclass paths trainee;\r\nclass Data_Built-in_Functions trainee;\r\n\r\nclass PyTorch middle;\r\nclass TensorFlow middle;\r\n```\r\n## Data Flows\r\n\r\nAdd more specific capabilities to your data management skills. All of the topics covered are essential in the practical programming process and are present in all modern languages in one form or another. That way, if you eventually switch from Python to Java, C# or C++, the knowledge you've acquired won't become dead weight.\r\n\r\n```mermaid\r\nflowchart TD\r\n\r\nsubgraph Data_Flows\r\ndirection LR\r\n\r\nitertools -.-\u003e enumerate -.-\u003e Generator -.-\u003e Decorator -.-\u003e Context_managers\r\n\r\nsubgraph itertools\r\ndirection LR\r\n\r\nsubgraph Infinite_Iterators\r\nicount(count)\r\nicycle(cycle)\r\nirepeat(repeat)\r\nend\r\n\r\nsubgraph Finite_Iterators\r\naccumulate(accumulate)\r\nchain(chain)\r\ncompress(compress)\r\ndropwhile(dropwhile)\r\ntakewhile(takewhile)\r\nfimore(...)\r\nend\r\n\r\nsubgraph Combinatorics\r\nproduct(product)\r\ncombinations(combinations)\r\npermutations(permutations)\r\ncombinations_with_replacement(combinations_with_replacement)\r\nend\r\nend\r\n\r\nenumerate(enumerate)\r\n\r\nsubgraph Generator\r\ndirection LR\r\nyield(\"yield\")\r\nGenerator_expression(\"Generator expression\")\r\nyield_from(\"yield from\")\r\nend\r\n\r\nsubgraph Decorator\r\ndirection LR\r\ndecorator(decorator)\r\nLRUCache(\"LRU Cache\")\r\nparam_decorator(\"Parameterized decorator\")\r\nend\r\n\r\nsubgraph Context_managers\r\ndirection LR\r\nenter_exit_cm(\"__enter__, __exit__\")\r\ncontextlib(contextlib)\r\nend\r\n\r\nend\r\n\r\nclassDef trainee fill:#6ADA6A, stroke-width:3px\r\n\r\nclass icount trainee;\r\nclass icycle trainee;\r\nclass irepeat trainee;\r\nclass accumulate trainee;\r\nclass chain trainee;\r\nclass compress trainee;\r\nclass dropwhile trainee;\r\nclass takewhile trainee;\r\nclass product trainee;\r\nclass combinations trainee;\r\nclass enumerate trainee;\r\nclass yield trainee;\r\nclass decorator trainee;\r\nclass enter_exit_cm trainee;\r\n```\r\n## Object-Oriented Programming\r\n\r\nDive into the subject of object-oriented programming. Understand that objects are your friends, and all their features and properties, even if they are not quite intuitive at first glance, have purely utilitarian reasons for existing.\r\n\r\nOOP makes it much easier to partition, develop and maintain code, not just making very complex tasks feasible for average programmers, but making the world around us more manageable, predictable and generally better.\r\n\r\n```mermaid\r\nflowchart TD\r\n\r\nsubgraph OOP\r\ndirection LR\r\nOOP_Base -.-\u003e Duck_Types -.-\u003e Iterable_Duck_Types -.-\u003e Object_Copy -.-\u003eInheritance -.-\u003e Metaprogramming\r\n\r\nsubgraph OOP_Base\r\ndirection LR\r\noopBase1(\"init, repr, str\")\r\noop_property(\"@property\")\r\nstaticmethod(\"@staticmethod\")\r\nclassmethod(\"@classmethod, cls, self\")\r\nslots(slots)\r\nend\r\n\r\nsubgraph Duck_Types\r\ndirection LR\r\nIterator(Iterator)\r\nComparable(Comparable)\r\nHashable(Hashable)\r\nSortable(Sortable)\r\nCallable(Callable)\r\ndt_Context_Manager(\"Context Manager\")\r\nend\r\n\r\nsubgraph Iterable_Duck_Types\r\ndirection LR\r\nIterable(Iterable)\r\nCollection(Collection)\r\nSequence(Sequence)\r\nABC_Sequence(\"ABC Sequence\")\r\nend\r\n\r\nsubgraph Object_Copy\r\ndirection LR\r\nshallow(\"Shallow copy\")\r\ndeep(\"Deep copy\")\r\nend\r\n\r\nsubgraph Inheritance\r\ndirection LR\r\nobjInheritance(Inheritance)\r\nMultiple_Inheritance(\"Multiple Inheritance\")\r\nabstractmethod(\"@abstractmethod\")\r\nMRO(MRO)\r\nInheritance_of_slots(\"Slots' inheritance\")\r\nend\r\n\r\nsubgraph Metaprogramming\r\ndirection LR\r\nMetaclass(\"Meta Class\")\r\nABCMeta(ABCMeta)\r\nRegistry(Registry)\r\nend\r\n\r\nend\r\n\r\nclassDef trainee fill:#6ADA6A, stroke-width:3px\r\n\r\nclass oopBase1 trainee;\r\nclass oop_property trainee;\r\nclass staticmethod trainee;\r\nclass classmethod trainee;\r\nclass slots trainee;\r\nclass Iterator trainee;\r\nclass Comparable trainee;\r\nclass Hashable trainee;\r\nclass Sortable trainee;\r\nclass Iterable trainee;\r\nclass Collection trainee;\r\nclass shallow trainee;\r\nclass deep trainee;\r\nclass objInheritance trainee;\r\nclass Multiple_Inheritance trainee;\r\nclass MRO trainee;\r\n```\r\n## Language Skeleton\r\n\r\nPerfect, a bit deeper now. Studying how GIL or GC works will give you an understanding of why things go awry in one case or another, not at all the way you planned. You are likely to use exceptions all the time, given that they can occur in some operations with data structures, so study them further.\r\n\r\n```mermaid\r\nflowchart TD\r\n\r\nsubgraph Language_Skeleton\r\ndirection LR\r\nGarbage_Collector -.-\u003e Exception -.-\u003e Typing -.-\u003e Introspection -.-\u003e Other\r\n\r\nsubgraph Garbage_Collector\r\ndirection LR\r\nreference_counting(\"Reference counting\")\r\ngarbage_collector(\"Garbage collector\")\r\ndebug_objgraph(\"GC debug / objgraph\")\r\npypygc(\"PyPy GC\")\r\nend\r\n\r\nsubgraph Exception\r\ndirection LR\r\nexception_handling(\"Exception handling\")\r\nbuilt_in_exceptions(\"Built-in exceptions\")\r\nexception_raising(\"Exception raising\")\r\nuser_exception(\"User exceptions\")\r\nexception_object(\"Exception Object\")\r\nend\r\n\r\nsubgraph Typing\r\ndirection LR\r\ntyping_loc(typing)\r\nProtocol(Protocol)\r\nfinal(\"final (name mangling)\")\r\nLiteral(Literal)\r\nTypedDict(TypedDict)\r\nend\r\n\r\nsubgraph Introspection\r\ndirection LR\r\nvariables(variables)\r\nattributes(attributes)\r\nparameters(parameters)\r\nend\r\n\r\nsubgraph Other\r\ndirection LR\r\nGIL(GIL)\r\nargs_kwargs(\"*, *args, **kwargs\")\r\nlambda(lambda)\r\nClosure(Closure)\r\nOperator(Operator)\r\nend\r\n\r\nend\r\n\r\nclassDef trainee fill:#6ADA6A, stroke-width:3px\r\n\r\nclass reference_counting trainee;\r\nclass garbage_collector trainee;\r\nclass exception_handling trainee;\r\nclass built_in_exceptions trainee;\r\nclass exception_raising trainee;\r\nclass typing_loc trainee;\r\nclass variables trainee;\r\nclass GIL trainee;\r\nclass args_kwargs trainee;\r\nclass lambda trainee;\r\n```\r\n## Multithreading and Multiprocessing\r\n\r\nBefore you dive into multithreading and multiprocessing, be sure to study their typical use cases. There may be situations in which the gain is minimal or non-existent.\r\n\r\nTry to implement simultaneous fast data processing and waiting for user input, which changes the input data for calculations, so you understand the capabilities, pros and cons of different approaches.\r\n\r\nDon't try to use all the features provided by Python at once, stick to the task at hand.\r\n\r\n```mermaid\r\nflowchart TD\r\n\r\nsubgraph Multithreading_\u0026_Multiprocessing\r\ndirection LR\r\n\r\nMultithreading -.-\u003e asyncio -.-\u003e Multiprocessing -.-\u003eSynchronization\r\n\r\nsubgraph Multithreading\r\ndirection LR\r\nThread(Thread)\r\nThread_Pool_Executor(\"Thread pool executor\")\r\nTimer\r\nend\r\n\r\nsubgraph asyncio\r\ndirection LR\r\nsubgraph High_level_API\r\nsleep(sleep)\r\nrun(run)\r\ncreate_task(create_task)\r\ngather(gather)\r\nhilapi_more(\"...\")\r\nend\r\nsubgraph asyncio_Queues\r\nasQueue(Queue)\r\nasPriorityQueue(PriorityQueue)\r\nasLifoQueue(LifoQueue)\r\nend\r\nsubgraph asyncio_Streams\r\nStreamReader(StreamReader)\r\nStreamWriter(StreamWriter)\r\nend\r\nsubgraph Low_level_API\r\nnew_event_loop(new_event_loop)\r\nrun_forever(run_forever)\r\nlowlapi_more(\"...\")\r\nend\r\nend\r\n\r\nsubgraph Multiprocessing\r\ndirection LR\r\nPool(Pool)\r\nProcess(Process)\r\nPipe(Pipe)\r\nValue(Value)\r\nmuArray(Array)\r\nManager(Manager)\r\nListener(Listener)\r\nend\r\n\r\nsubgraph Synchronization\r\ndirection LR\r\nLock(Lock)\r\nEvent(Event)\r\nCondition(Condition)\r\nSemaphore(Semaphore)\r\nBoundedSemaphore(BoundedSemaphore)\r\nBarrier(Barrier)\r\nend\r\n\r\nend\r\n\r\nclassDef trainee fill:#6ADA6A, stroke-width:3px\r\n\r\nclass Thread trainee;\r\nclass sleep trainee;\r\nclass run trainee;\r\nclass create_task trainee;\r\nclass gather trainee;\r\nclass asQueue trainee;\r\nclass Pool trainee;\r\nclass Lock trainee;\r\nclass Event trainee;\r\n```\r\n## Common Practices\r\n\r\nDescription of common methods used in almost all software projects, not just in Python. I/O, profiling, and logging apply universally.\r\n\r\nTesting in general constitutes a separate profession, and often the quality of a software product can be judged by the test coverage of the source code. For example, the code of the SQLite database is 100% [covered by tests](https://www.sqlite.org/testing.html), while one line of \"combative\" code requires 608 lines of tests.  \r\nJokes aside, projects with 100% coverage are not common, but pytest used wisely is the best guarantor of your sound sleep at night!\r\n\r\n```mermaid\r\nflowchart TD\r\n\r\nsubgraph Common_Practices\r\ndirection LR\r\n\r\nLogging -.-\u003e Profiling -.-\u003e Random -.-\u003e Input -.-\u003e Print -.-\u003e Cryptography -.-\u003e Testing\r\n\r\nsubgraph Logging\r\ndirection LR\r\nStreamHandler(StreamHandler)\r\nColoredFormatter(ColoredFormatter)\r\nLog_formatting(\"Log formatting\")\r\nRotatingFileHandler(RotatingFileHandler)\r\nTimedRotatingFileHandler(TimedRotatingFileHandler)\r\nELK_Stack(\"ELK Stack\")\r\nend\r\n\r\nsubgraph Profiling\r\ndirection LR\r\nStopwatch(Stopwatch)\r\nperf_counter(perf_counter)\r\ntimeit(timeit)\r\nCall_Graph(\"Call Graph\")\r\nend\r\n\r\nsubgraph Random\r\ndirection LR\r\nrandom_mod(random)\r\nsecrets(secrets)\r\nend\r\n\r\nsubgraph Input\r\ndirection LR\r\ninput(input)\r\nCommand_Line_Arguments(\"Command Line Arguments\")\r\nArgument_Parser(\"Argument Parser\")\r\nend\r\n\r\nsubgraph Print\r\ndirection LR\r\nsimple_print(print)\r\njson_print(\"json.dumps\")\r\nPretty_Print(pprint)\r\nend\r\n\r\nsubgraph Cryptography\r\ndirection LR\r\nMD5(MD5)\r\nAES(AES)\r\ncryptomore(\"...\")\r\nend\r\n\r\nsubgraph Testing\r\ndirection LR\r\npytest(pytest)\r\nmock(mock)\r\nend\r\n\r\nend\r\n\r\nclassDef trainee fill:#6ADA6A, stroke-width:3px\r\nclassDef middle fill:#FF9900, stroke-width:3px\r\n\r\nclass StreamHandler trainee;\r\nclass Stopwatch trainee;\r\nclass timeit trainee;\r\nclass random_mod trainee;\r\nclass input trainee;\r\nclass Command_Line_Arguments trainee;\r\nclass simple_print trainee;\r\nclass MD5 trainee;\r\nclass AES trainee;\r\nclass pytest trainee;\r\n\r\nclass ELK_Stack middle;\r\nclass cryptomore middle;\r\n```\r\n## Algorithms\r\n\r\nOne of those areas of human knowledge that you can delve into endlessly. On the other hand, the learning curve of this discipline for covering the practical needs of the average programmer has long been known, so the initial stages shouldn't be too difficult for you. Who knows, maybe you'll enjoy it so much and drag it out that in time you might even be able to contribute a new robust argument in the discussion of “[Equality of P and NP classes](https://en.wikipedia.org/wiki/P_versus_NP_problem)”!\r\n\r\n```mermaid\r\nflowchart TD\r\n\r\nsubgraph Algorithms\r\ndirection LR\r\nFizzBuzz -.-\u003e bigo -.-\u003e Sort -.-\u003e Graphs -.-\u003e Search -.-\u003e Methods\r\nRecursion ==\u003e Recursion\r\n\r\nFizzBuzz(FizzBuzz)\r\nbigo(\"O(n)\")\r\n\r\nsubgraph Sort\r\ndirection LR\r\nBubbleSort(BubbleSort)\r\nQuickSort(QuickSort)\r\nMergeSort(MergeSort)\r\nHeapSort(HeapSort)\r\nInsertionSort(InsertionSort)\r\nRadixSort(RadixSort)\r\nend\r\n\r\nsubgraph Graphs\r\ndirection LR\r\nAdjacency_Matrix(\"Adjacency matrix\")\r\nIncidence_Matrix(\"Incidence matrix\")\r\nAdjacency_List(\"Adjacency list\")\r\nIncidence_List(\"Incidence list\")\r\nend\r\n\r\nsubgraph Search\r\ndirection LR\r\nLinear_Search(\"Linear search\")\r\nBinary_Search(\"Binary search\")\r\nDFS(DFS)\r\nBFS(BFS)\r\nDijkstras(Dijkstras)\r\nBellman_Ford(\"Bellman–Ford\")\r\nend\r\n\r\nsubgraph Methods\r\ndirection LR\r\ndivide_and_conquer(\"Divide and conquer\")\r\nDynamic_programming(\"Dynamic programming\")\r\nGreedy_algorithm(\"Greedy algorithm\")\r\nRecursion(Recursion)\r\nmethmore(\"...\")\r\nend\r\n\r\nend\r\n\r\nclassDef trainee fill:#6ADA6A, stroke-width:3px\r\nclassDef middle fill:#FF9900, stroke-width:3px\r\n\r\nclass FizzBuzz trainee;\r\nclass bigo trainee;\r\nclass BubbleSort trainee;\r\nclass QuickSort trainee;\r\nclass RadixSort trainee;\r\nclass Adjacency_Matrix trainee;\r\nclass Adjacency_List trainee;\r\nclass Linear_Search trainee;\r\nclass Binary_Search trainee;\r\nclass DFS trainee;\r\nclass divide_and_conquer trainee;\r\nclass Recursion trainee;\r\nclass Greedy_algorithm trainee;\r\n\r\nclass methmore middle;\r\n```\r\n## Databases\r\n\r\nLearn the general concepts first, and then the specifics of working with specific database management systems. Try working with SQLite, even if you're planning to switch to PostgreSQL later. SQLite is a very popular database, used in Android, Chromium and dozens of other popular projects. You can use SQLite as a convenient local storage alternative to working with files directly.\r\n\r\nBy the way, try to briefly return to chapter one, Data Structures, to understand how and why the inner workings of databases are structured.\r\n\r\nThis also provides yet another door into a \"another world\". Perhaps you would like to tie your future to databases by becoming a [DBA](https://en.wikipedia.org/wiki/Database_administrator)?\r\n\r\n```mermaid\r\nflowchart TD\r\n\r\nsubgraph Databases\r\ndirection LR\r\n\r\nDatabases_basics -.-\u003e SQL -.-\u003e SQLite -.-\u003e MySQL -.-\u003e PostgreSQL -.-\u003e ORM -.-\u003e Analyze_an_execution_plan\r\n\r\nsubgraph Databases_basics\r\ndirection LR\r\nRelational_model(\"Relational model\")\r\nTransaction(Transaction)\r\nsubgraph ACID\r\nConsistency(Consistency)\r\nIsolation(Isolation)\r\nend\r\nNplusone(\"N+1 problem\")\r\nSQL_injection(\"SQL injection\")\r\nNoSQL(NoSQL)\r\nend\r\n\r\nsubgraph SQL\r\ndirection LR\r\n\r\nsubgraph DDL\r\nCREATE(CREATE)\r\nALTER(ALTER)\r\nDROP(DROP)\r\nPRIMARY_KEY(\"PRIMARY KEY\")\r\nFOREIGN_KEY(\"FOREIGN KEY\")\r\nddlmore(\"...\")\r\nend\r\n\r\nsubgraph DML\r\nSELECT(SELECT)\r\nINSERT(INSERT)\r\nUPDATE(UPDATE)\r\nDELETE(DELETE)\r\nFROM(FROM)\r\nWHERE(WHERE)\r\nSET(SET)\r\n\r\ndmlmore(\"...\")\r\nend\r\n\r\nDCL(DCL)\r\nTCL(TCL)\r\nSQL_standard(\"SQL standard\")\r\n\r\nend\r\n\r\nsubgraph SQLite\r\ndirection LR\r\nSQLite_benefits(\"SQLite benefits\")\r\nSyntax_Diagrams(\"Syntax Diagrams\")\r\nDB_Browser_for_SQLite(\"DB Browser for SQLite\")\r\nend\r\n\r\nsubgraph MySQL\r\ndirection LR\r\nMySQL_Workbench(\"MySQL Workbench\")\r\nend\r\n\r\nsubgraph PostgreSQL\r\ndirection LR\r\nPostgreSQL_benefits(\"PostgreSQL benefits\")\r\npsql(psql)\r\npgAdmin(pgAdmin)\r\nPostgreSQL_more(\"...\")\r\nend\r\n\r\nsubgraph ORM\r\ndirection LR\r\npeewee(peewee)\r\nSQLAlchemy(SQLAlchemy)\r\nDjango_ORM(\"Django ORM\")\r\nend\r\n\r\nAnalyze_an_execution_plan(\"Analyze an execution plan\")\r\n\r\nend\r\nclassDef trainee fill:#6ADA6A, stroke-width:3px\r\nclassDef middle fill:#FF9900, stroke-width:3px\r\n\r\nclass Relational_model trainee;\r\nclass Transaction trainee;\r\nclass Consistency trainee;\r\nclass Isolation trainee;\r\nclass CREATE trainee;\r\nclass ALTER trainee;\r\nclass DROP trainee;\r\nclass PRIMARY_KEY trainee;\r\nclass FOREIGN_KEY trainee;\r\nclass SELECT trainee;\r\nclass INSERT trainee;\r\nclass UPDATE trainee;\r\nclass DELETE trainee;\r\nclass FROM trainee;\r\nclass WHERE trainee;\r\nclass SET trainee;\r\nclass SQLite_benefits trainee;\r\nclass Syntax_Diagrams trainee;\r\nclass PostgreSQL_benefits trainee;\r\nclass peewee trainee;\r\n\r\nclass NoSQL middle;\r\nclass SQL_standard middle;\r\nclass PostgreSQL_more middle;\r\nclass SQLAlchemy middle;\r\nclass Django_ORM middle;\r\nclass Analyze_an_execution_plan middle;\r\n```\r\n## Net\r\n\r\nTry to create a client and a server, poke some popular website or an open API. Here you might as well experiment with HTML, CSS, and even Java(Type)Script. Who knows, perhaps your choice would be to become a full-stack programmer, combining back- and frontend development.\r\n\r\n```mermaid\r\nflowchart TD\r\n\r\nsubgraph Net\r\ndirection LR\r\nHTTP -.-\u003e requests -.-\u003e websocket -.-\u003e Frameworks -.-\u003e API\r\n\r\nsubgraph HTTP\r\ndirection LR\r\nHTTPS(HTTPS)\r\nCORS(CORS)\r\nend\r\n\r\nrequests(requests)\r\nwebsocket(websocket)\r\n\r\nsubgraph Frameworks\r\ndirection LR\r\nFlask(Flask)\r\naiohttp(aiohttp)\r\nDjango(Django)\r\nend\r\n\r\nsubgraph API\r\ndirection LR\r\nREST(REST)\r\nPostman(Postman)\r\nAuthentication(Authentication)\r\njwt_tokens(\"JWT tokens\")\r\nSwagger(Swagger)\r\nFastAPI(FastAPI)\r\nGraphQL(GraphQL)\r\nend\r\n\r\nend\r\n\r\nclassDef trainee fill:#6ADA6A, stroke-width:3px\r\nclassDef middle fill:#FF9900, stroke-width:3px\r\n\r\nclass HTTPS trainee;\r\nclass requests trainee;\r\nclass websocket trainee;\r\nclass Flask trainee;\r\nclass REST trainee;\r\nclass Postman trainee;\r\n\r\nclass Django middle;\r\nclass FastAPI middle;\r\nclass GraphQL middle;\r\n```\r\n## Architecture\r\n\r\nPlease try not to memorize architectural principles by heart; they are not Shakespeare's timeless poems. The rambling about how “Liskov's substitution principle means that if S is a subtype of T, then objects of type T in a program can be...” offers no advantage to anyone.\r\nJust try applying the same LSP to the program you are writing. What benefit would compliance with this principle give you? What problems will result from not following it? What price will you have to pay for its implementation and support?\r\n\r\nTry messing around with the functional paradigm. Applying the functional approach and using it in practice is possible not only in Haskell or F#, but also in Python, and it doesn't have to be done only within functools.\r\n\r\nFigure out the reasoning behind the job interviewer's request to “say the three main words” (it's not “I love you”, by the way, it’s “inheritance, encapsulation, polymorphism”) and why this triad should be supplemented with the “abstraction”.\r\n\r\nTry to understand what specific, tangible problems of the old paradigms the developers of Agile or the popularizers of microservice architecture faced. Figure out what's wrong with main(), which calls all the other procedures, since this is common practice in embedded programming. Weigh the cost of additional layers of abstraction between the root business logic and the outside world.\r\n\r\n```mermaid\r\nflowchart TD\r\n\r\nsubgraph Architecture\r\ndirection LR\r\nWhatIsArch -.-\u003e Principles -.-\u003e Paradigms -.-\u003e Object-oriented -.-\u003e Design_Patterns -.-\u003e Microservices -.-\u003e System_Design -.-\u003e Practices\r\n\r\nWhatIsArch(\"What is?\")\r\nsubgraph Principles\r\ndirection LR\r\n\r\nsubgraph SOLID\r\nSRP(SRP)\r\nOCP(OCP)\r\nLSP(LSP)\r\nISP(ISP)\r\nDIP(DIP)\r\nend\r\n\r\ncoupling_vs_cohesion(\"Coupling vs cohesion\")\r\nKISS(KISS)\r\nDRY(DRY)\r\nYAGNI(YAGNI)\r\n\r\nend\r\n\r\nsubgraph Paradigms\r\ndirection LR\r\nProcedural(Procedural)\r\nStructured(Structured)\r\nparObject-oriented(Object-oriented)\r\nFunctional(Functional)\r\nend\r\n\r\nsubgraph Object-oriented\r\ndirection LR\r\nooInheritance(Inheritance)\r\nEncapsulation(Encapsulation)\r\nPolymorphism(Polymorphism)\r\nAbstraction(Abstraction)\r\nend\r\n\r\nsubgraph Microservices\r\ndirection LR\r\n\r\nDecentralization(Decentralization)\r\nSmart_endpoints_dumb_pipes(\"Smart endpoints, dumb pipes\")\r\nDesign_for_failure(\"Design for failure\")\r\n\r\nsubgraph Messaging\r\ndirection LR\r\nRabbitMQ(RabbitMQ)\r\nApache_Kafka(\"Apache Kafka\")\r\nend\r\nend\r\n\r\nsubgraph Design_Patterns\r\ndirection LR\r\n\r\nObserver(Observer)\r\nDecorator_Method(Decorator)\r\nFactory_Method(\"Factory Method\")\r\nAdapter_Facade(\"Adapter, Facade\")\r\n\r\nCreational_patterns(\"Creational patterns\")\r\nStructural_patterns(\"Structural patterns\")\r\nBehavioral_patterns(\"Behavioral patterns\")\r\nend\r\n\r\nsubgraph System_Design\r\ndirection LR\r\nCQRS(CQRS)\r\nTwo_Phase_Commit(\"Two-Phase Commit\")\r\nLoad_Balanced_Services(\"Load-Balanced Services\")\r\nPattern_of_Distributed_Systems(\"Patterns of Distributed Systems\")\r\nCloud_Design_Patterns(\"Cloud Design Patterns\")\r\nend\r\n\r\nsubgraph Practices\r\ndirection LR\r\nAgile(Agile)\r\nScrum(Scrum)\r\nKanban(Kanban)\r\nend\r\n\r\nend\r\n\r\nclassDef trainee fill:#6ADA6A, stroke-width:3px\r\nclassDef middle fill:#FF9900, stroke-width:3px\r\n\r\nclass WhatIsArch trainee;\r\nclass SRP trainee;\r\nclass OCP trainee;\r\nclass LSP trainee;\r\nclass ISP trainee;\r\nclass DIP trainee;\r\nclass coupling_vs_cohesion trainee;\r\nclass Procedural trainee;\r\nclass parObject-oriented trainee;\r\nclass ooInheritance trainee;\r\nclass Encapsulation trainee;\r\nclass Polymorphism trainee;\r\nclass Abstraction trainee;\r\nclass Observer trainee;\r\nclass Decorator_Method trainee;\r\nclass Factory_Method trainee;\r\nclass Adapter_Facade trainee;\r\nclass Decentralization trainee;\r\nclass Smart_endpoints_dumb_pipes trainee;\r\nclass CQRS trainee;\r\n\r\nclass Functional middle;\r\nclass Creational_patterns middle;\r\nclass Structural_patterns middle;\r\nclass Behavioral_patterns middle;\r\nclass RabbitMQ middle;\r\nclass Apache_Kafka middle;\r\nclass Pattern_of_Distributed_Systems middle;\r\nclass Cloud_Design_Patterns middle;\r\nclass Scrum middle;\r\n```\r\n## Deployment and Administration\r\n\r\nDespite the fact that git and especially Linux are quite complicated and extensive topics, the beginning of their learning curve isn't very steep, so I highly recommend starting your DevOps mastering with git (at least the add-commit-push part, so you at least have a revision history, flawed as it is) and Linux (PuTTY + WinSCP, for example; copy your Python scripts via SSH and run them on a remote Linux machine). Fortunately, these days good text and video tutorials covering these topics are about as rare as grains of sand on the beach.\r\nTake it from me, the Linux console that looks so strange and inconvenient at first sight will seem much more familiar once you start learning vim. Cognition comes through comparison!\r\n\r\nWell, this is where our map ends. Try to reach the last green section, GitHub Actions; run a linter on your open source project, for example (GitHub Actions is free for open source projects).\r\n\r\n```mermaid\r\nflowchart TD\r\n\r\nsubgraph DevOps\r\ndirection LR\r\ngit -.-\u003e Linux -.-\u003e Development_lifecycle -.-\u003e CI_CD -.-\u003e Containers\r\n\r\nsubgraph git\r\ndirection LR\r\nBasics(Basics)\r\nBranching(Branching)\r\nTools(Tools)\r\nGitHub(GitHub)\r\nend\r\n\r\nsubgraph Linux\r\ndirection LR\r\nInstall(Install)\r\nDirectory_Structure(\"Directory Structure\")\r\nTerminal(Terminal)\r\nInput_Output(\"Input/Output\")\r\nbash(bash)\r\nSystem_administration(\"System administration\")\r\nNetwork_administration(\"Network administration\")\r\nend\r\n\r\nsubgraph Development_lifecycle\r\ndirection LR\r\nGit_flow(\"Git-flow\")\r\ntrunk_based_development(\"Trunk-based development\")\r\nend\r\n\r\nsubgraph CI_CD\r\ndirection LR\r\nContinuous_testing(\"Continuous testing\")\r\nGitHub_Actions(\"GitHub Actions\")\r\nJenkins(Jenkins)\r\nNew_Relic(\"New Relic\")\r\nend\r\n\r\nsubgraph Containers\r\ndirection LR\r\nDocker(Docker)\r\nKubernetes(Kubernetes)\r\nend\r\n\r\nend\r\n\r\nclassDef trainee fill:#6ADA6A, stroke-width:3px\r\nclassDef middle fill:#FF9900, stroke-width:3px\r\n\r\nclass Basics trainee;\r\nclass GitHub trainee;\r\nclass Install trainee;\r\nclass Directory_Structure trainee;\r\nclass Terminal trainee;\r\nclass trunk_based_development trainee;\r\nclass GitHub_Actions trainee;\r\n\r\nclass bash middle;\r\nclass System_administration middle;\r\nclass Network_administration middle;\r\nclass Jenkins middle;\r\nclass New_Relic middle;\r\nclass Docker middle;\r\nclass Kubernetes middle;\r\n```\r\n## Overall Roadmap\r\n\r\nThe overall roadmap can be obtained by simply mechanically adding up the previous entries, just so we can see what we've ended up with. Overall [Mermaid](https://github.com/amaargiru/pyroad/blob/main/13_Full.md), [svg](https://raw.githubusercontent.com/amaargiru/pyroad/main/pics_svg/13_Full.svg), [png](https://raw.githubusercontent.com/amaargiru/pyroad/main/pics_png/13_Full.png).\r\n\r\n```mermaid\r\nflowchart TD\r\nData_Structures ==\u003e Data_Management ==\u003e Data_Flows ==\u003e OOP ==\u003e Language_Skeleton ==\u003e Multithreading_\u0026_Multiprocessing ==\u003e Common_Practices ==\u003e Algorithms ==\u003e Databases ==\u003e Net ==\u003e Architecture ==\u003e DevOps\r\n\r\nsubgraph Data_Structures\r\ndirection LR\r\nList(list) -.-\u003e Tuple -.-\u003e Dict -.-\u003e Set -.-\u003e Array -.-\u003e Linked_List -.-\u003eTree -.-\u003e Python_specific_data_structures\r\n\r\nsubgraph Tuple\r\ndirection LR\r\ntuple(tuple)\r\nnamedtuple(namedtuple)\r\nend\r\n\r\nsubgraph Dict\r\ndirection LR\r\ndict(dict)\r\nHashProblem(\"Hash collisions\")\r\ndefaultdict(defaultdict)\r\nCounter(Counter)\r\nend\r\n\r\nsubgraph Set\r\ndirection LR\r\nset(set)\r\nFrozenSet(\"frozen set\")\r\nend\r\n\r\nsubgraph Array\r\ndirection LR\r\narray(array)\r\nbytes(bytes)\r\nbytearray(bytearray)\r\nend\r\n\r\nsubgraph Linked_List\r\ndirection LR\r\nSinglyLinkedList(\"Singly linked list\")\r\nsubgraph Doubly_Linked_List\r\ndirection LR\r\ndeque(deque)\r\nQueue(Queue)\r\nend\r\nend\r\n\r\nsubgraph Tree\r\ndirection LR\r\ntree(\"Binary tree\")\r\nheap(heap)\r\nB-tree(B-tree)\r\nRedBlackTree(\"Red–black tree\")\r\nAVLTree(\"AVL tree\")\r\ntrie(trie)\r\nend\r\n\r\nsubgraph Python_specific_data_structures\r\ndirection LR\r\nenum(enum)\r\nrange(range)\r\ndataclass(dataclass)\r\nstruct(struct)\r\nstring(string)\r\ndatetime(datetime)\r\nend\r\nend\r\n\r\nsubgraph Data_Management\r\ndirection LR\r\nslice(slice) -.-\u003e Sorting -.-\u003e Comprehension -.-\u003e String_Management -.-\u003e Datetime_Management -.-\u003e bisect(bisect) -.-\u003e Functools -.-\u003eFile -.-\u003e Data_Analysis -.-\u003e Neural_Networks\r\nsubgraph Sorting\r\ndirection LR\r\nsort(sort)\r\nsorted(sorted)\r\nend\r\n\r\nsubgraph Comprehension\r\ndirection LR\r\nlistcomprehension(list)\r\ndictcomprehension(dict)\r\nsetcomprehension(set)\r\nend\r\n\r\nsubgraph String_Management\r\ndirection LR\r\nString_Built-in_Functions(\"Built-in functions\")\r\nregex(regex)\r\nend\r\n\r\nsubgraph Datetime_Management\r\ndirection LR\r\nencode(encode)\r\ndecode(decode)\r\ndtmath(math)\r\nend\r\n\r\nsubgraph Functools\r\ndirection LR\r\nfmap(map)\r\nffilter(filter)\r\nfreduce(reduce)\r\nfpartial(partial)\r\nfmore(...)\r\nend\r\n\r\nsubgraph File\r\ndirection LR\r\nRead_Write(\"read/write\")\r\nText_Binary(\"text/binary\")\r\nJSON(JSON)\r\nPickle(\"Pickle\")\r\nProtocol_Buffers(\"Protocol Buffers\")\r\npaths(paths)\r\nend\r\n\r\nsubgraph Data_Analysis\r\ndirection LR\r\nData_Built-in_Functions(\"Built-in functions\")\r\nNumPy(NumPy)\r\nPandas(Pandas)\r\nMatplotlib_Seaborn(\"Matplotlib/Seaborn\")\r\nend\r\n\r\nsubgraph Neural_Networks\r\ndirection LR\r\nPyTorch(PyTorch)\r\nTensorFlow(\"TensorFlow/Keras\")\r\nend\r\n\r\nend\r\n\r\nsubgraph Data_Flows\r\ndirection LR\r\n\r\nitertools -.-\u003e enumerate -.-\u003e Generator -.-\u003e Decorator -.-\u003e Context_managers\r\n\r\nsubgraph itertools\r\ndirection LR\r\n\r\nsubgraph Infinite_Iterators\r\nicount(count)\r\nicycle(cycle)\r\nirepeat(repeat)\r\nend\r\n\r\nsubgraph Finite_Iterators\r\naccumulate(accumulate)\r\nchain(chain)\r\ncompress(compress)\r\ndropwhile(dropwhile)\r\ntakewhile(takewhile)\r\nfimore(...)\r\nend\r\n\r\nsubgraph Combinatorics\r\nproduct(product)\r\ncombinations(combinations)\r\npermutations(permutations)\r\ncombinations_with_replacement(combinations_with_replacement)\r\nend\r\nend\r\n\r\nenumerate(enumerate)\r\n\r\nsubgraph Generator\r\ndirection LR\r\nyield(\"yield\")\r\nGenerator_expression(\"Generator expression\")\r\nyield_from(\"yield from\")\r\nend\r\n\r\nsubgraph Decorator\r\ndirection LR\r\ndecorator(decorator)\r\nLRUCache(\"LRU Cache\")\r\nparam_decorator(\"Parameterized decorator\")\r\nend\r\n\r\nsubgraph Context_managers\r\ndirection LR\r\nenter_exit_cm(\"__enter__, __exit__\")\r\ncontextlib(contextlib)\r\nend\r\n\r\nend\r\n\r\nsubgraph OOP\r\ndirection LR\r\nOOP_Base -.-\u003e Duck_Types -.-\u003e Iterable_Duck_Types -.-\u003e Object_Copy -.-\u003eInheritance -.-\u003e Metaprogramming\r\n\r\nsubgraph OOP_Base\r\ndirection LR\r\noopBase1(\"init, repr, str\")\r\noop_property(\"@property\")\r\nstaticmethod(\"@staticmethod\")\r\nclassmethod(\"@classmethod, cls, self\")\r\nslots(slots)\r\nend\r\n\r\nsubgraph Duck_Types\r\ndirection LR\r\nIterator(Iterator)\r\nComparable(Comparable)\r\nHashable(Hashable)\r\nSortable(Sortable)\r\nCallable(Callable)\r\ndt_Context_Manager(\"Context Manager\")\r\nend\r\n\r\nsubgraph Iterable_Duck_Types\r\ndirection LR\r\nIterable(Iterable)\r\nCollection(Collection)\r\nSequence(Sequence)\r\nABC_Sequence(\"ABC Sequence\")\r\nend\r\n\r\nsubgraph Object_Copy\r\ndirection LR\r\nshallow(\"Shallow copy\")\r\ndeep(\"Deep copy\")\r\nend\r\n\r\nsubgraph Inheritance\r\ndirection LR\r\nobjInheritance(Inheritance)\r\nMultiple_Inheritance(\"Multiple Inheritance\")\r\nabstractmethod(\"@abstractmethod\")\r\nMRO(MRO)\r\nInheritance_of_slots(\"Slots' inheritance\")\r\nend\r\n\r\nsubgraph Metaprogramming\r\ndirection LR\r\nMetaclass(\"Meta Class\")\r\nABCMeta(ABCMeta)\r\nRegistry(Registry)\r\nend\r\n\r\nend\r\n\r\nsubgraph Language_Skeleton\r\ndirection LR\r\nGarbage_Collector -.-\u003e Exception -.-\u003e Typing -.-\u003e Introspection -.-\u003e Other\r\n\r\nsubgraph Garbage_Collector\r\ndirection LR\r\nreference_counting(\"Reference counting\")\r\ngarbage_collector(\"Garbage collector\")\r\ndebug_objgraph(\"GC debug / objgraph\")\r\npypygc(\"PyPy GC\")\r\nend\r\n\r\nsubgraph Exception\r\ndirection LR\r\nexception_handling(\"Exception handling\")\r\nbuilt_in_exceptions(\"Built-in exceptions\")\r\nexception_raising(\"Exception raising\")\r\nuser_exception(\"User exceptions\")\r\nexception_object(\"Exception Object\")\r\nend\r\n\r\nsubgraph Typing\r\ndirection LR\r\ntyping_loc(typing)\r\nProtocol(Protocol)\r\nfinal(\"final (name mangling)\")\r\nLiteral(Literal)\r\nTypedDict(TypedDict)\r\nend\r\n\r\nsubgraph Introspection\r\ndirection LR\r\nvariables(variables)\r\nattributes(attributes)\r\nparameters(parameters)\r\nend\r\n\r\nsubgraph Other\r\ndirection LR\r\nGIL(GIL)\r\nargs_kwargs(\"*, *args, **kwargs\")\r\nlambda(lambda)\r\nClosure(Closure)\r\nOperator(Operator)\r\nend\r\n\r\nend\r\n\r\nsubgraph Multithreading_\u0026_Multiprocessing\r\ndirection LR\r\n\r\nMultithreading -.-\u003e asyncio -.-\u003e Multiprocessing -.-\u003eSynchronization\r\n\r\nsubgraph Multithreading\r\ndirection LR\r\nThread(Thread)\r\nThread_Pool_Executor(\"Thread pool executor\")\r\nTimer\r\nend\r\n\r\nsubgraph asyncio\r\ndirection LR\r\nsubgraph High_level_API\r\nsleep(sleep)\r\nrun(run)\r\ncreate_task(create_task)\r\ngather(gather)\r\nhilapi_more(\"...\")\r\nend\r\nsubgraph asyncio_Queues\r\nasQueue(Queue)\r\nasPriorityQueue(PriorityQueue)\r\nasLifoQueue(LifoQueue)\r\nend\r\nsubgraph asyncio_Streams\r\nStreamReader(StreamReader)\r\nStreamWriter(StreamWriter)\r\nend\r\nsubgraph Low_level_API\r\nnew_event_loop(new_event_loop)\r\nrun_forever(run_forever)\r\nlowlapi_more(\"...\")\r\nend\r\nend\r\n\r\nsubgraph Multiprocessing\r\ndirection LR\r\nPool(Pool)\r\nProcess(Process)\r\nPipe(Pipe)\r\nValue(Value)\r\nmuArray(Array)\r\nManager(Manager)\r\nListener(Listener)\r\nend\r\n\r\nsubgraph Synchronization\r\ndirection LR\r\nLock(Lock)\r\nEvent(Event)\r\nCondition(Condition)\r\nSemaphore(Semaphore)\r\nBoundedSemaphore(BoundedSemaphore)\r\nBarrier(Barrier)\r\nend\r\n\r\nend\r\n\r\nsubgraph Common_Practices\r\ndirection LR\r\n\r\nLogging -.-\u003e Profiling -.-\u003e Random -.-\u003e Input -.-\u003e Print -.-\u003e Cryptography -.-\u003e Testing\r\n\r\nsubgraph Logging\r\ndirection LR\r\nStreamHandler(StreamHandler)\r\nColoredFormatter(ColoredFormatter)\r\nLog_formatting(\"Log formatting\")\r\nRotatingFileHandler(RotatingFileHandler)\r\nTimedRotatingFileHandler(TimedRotatingFileHandler)\r\nELK_Stack(\"ELK Stack\")\r\nend\r\n\r\nsubgraph Profiling\r\ndirection LR\r\nStopwatch(Stopwatch)\r\nperf_counter(perf_counter)\r\ntimeit(timeit)\r\nCall_Graph(\"Call Graph\")\r\nend\r\n\r\nsubgraph Random\r\ndirection LR\r\nrandom_mod(random)\r\nsecrets(secrets)\r\nend\r\n\r\nsubgraph Input\r\ndirection LR\r\ninput(input)\r\nCommand_Line_Arguments(\"Command Line Arguments\")\r\nArgument_Parser(\"Argument Parser\")\r\nend\r\n\r\nsubgraph Print\r\ndirection LR\r\nsimple_print(print)\r\njson_print(\"json.dumps\")\r\nPretty_Print(pprint)\r\nend\r\n\r\nsubgraph Cryptography\r\ndirection LR\r\nMD5(MD5)\r\nAES(AES)\r\ncryptomore(\"...\")\r\nend\r\n\r\nsubgraph Testing\r\ndirection LR\r\npytest(pytest)\r\nmock(mock)\r\nend\r\n\r\nend\r\n\r\nsubgraph Algorithms\r\ndirection LR\r\nFizzBuzz -.-\u003e bigo -.-\u003e Sort -.-\u003e Graphs -.-\u003e Search -.-\u003e Methods\r\nRecursion ==\u003e Recursion\r\n\r\nFizzBuzz(FizzBuzz)\r\nbigo(\"O(n)\")\r\n\r\nsubgraph Sort\r\ndirection LR\r\nBubbleSort(BubbleSort)\r\nQuickSort(QuickSort)\r\nMergeSort(MergeSort)\r\nHeapSort(HeapSort)\r\nInsertionSort(InsertionSort)\r\nRadixSort(RadixSort)\r\nend\r\n\r\nsubgraph Graphs\r\ndirection LR\r\nAdjacency_Matrix(\"Adjacency matrix\")\r\nIncidence_Matrix(\"Incidence matrix\")\r\nAdjacency_List(\"Adjacency list\")\r\nIncidence_List(\"Incidence list\")\r\nend\r\n\r\nsubgraph Search\r\ndirection LR\r\nLinear_Search(\"Linear search\")\r\nBinary_Search(\"Binary search\")\r\nDFS(DFS)\r\nBFS(BFS)\r\nDijkstras(Dijkstras)\r\nBellman_Ford(\"Bellman–Ford\")\r\nend\r\n\r\nsubgraph Methods\r\ndirection LR\r\ndivide_and_conquer(\"Divide and conquer\")\r\nDynamic_programming(\"Dynamic programming\")\r\nGreedy_algorithm(\"Greedy algorithm\")\r\nRecursion(Recursion)\r\nmethmore(\"...\")\r\nend\r\n\r\nend\r\n\r\nsubgraph Databases\r\ndirection LR\r\n\r\nDatabases_basics -.-\u003e SQL -.-\u003e SQLite -.-\u003e MySQL -.-\u003e PostgreSQL -.-\u003e ORM -.-\u003e Analyze_an_execution_plan\r\n\r\nsubgraph Databases_basics\r\ndirection LR\r\nRelational_model(\"Relational model\")\r\nTransaction(Transaction)\r\nsubgraph ACID\r\nConsistency(Consistency)\r\nIsolation(Isolation)\r\nend\r\nNplusone(\"N+1 problem\")\r\nSQL_injection(\"SQL injection\")\r\nNoSQL(NoSQL)\r\nend\r\n\r\nsubgraph SQL\r\ndirection LR\r\n\r\nsubgraph DDL\r\nCREATE(CREATE)\r\nALTER(ALTER)\r\nDROP(DROP)\r\nPRIMARY_KEY(\"PRIMARY KEY\")\r\nFOREIGN_KEY(\"FOREIGN KEY\")\r\nddlmore(\"...\")\r\nend\r\n\r\nsubgraph DML\r\nSELECT(SELECT)\r\nINSERT(INSERT)\r\nUPDATE(UPDATE)\r\nDELETE(DELETE)\r\nFROM(FROM)\r\nWHERE(WHERE)\r\nSET(SET)\r\n\r\ndmlmore(\"...\")\r\nend\r\n\r\nDCL(DCL)\r\nTCL(TCL)\r\nSQL_standard(\"SQL standard\")\r\n\r\nend\r\n\r\nsubgraph SQLite\r\ndirection LR\r\nSQLite_benefits(\"SQLite benefits\")\r\nSyntax_Diagrams(\"Syntax Diagrams\")\r\nDB_Browser_for_SQLite(\"DB Browser for SQLite\")\r\nend\r\n\r\nsubgraph MySQL\r\ndirection LR\r\nMySQL_Workbench(\"MySQL Workbench\")\r\nend\r\n\r\nsubgraph PostgreSQL\r\ndirection LR\r\nPostgreSQL_benefits(\"PostgreSQL benefits\")\r\npsql(psql)\r\npgAdmin(pgAdmin)\r\nPostgreSQL_more(\"...\")\r\nend\r\n\r\nsubgraph ORM\r\ndirection LR\r\npeewee(peewee)\r\nSQLAlchemy(SQLAlchemy)\r\nDjango_ORM(\"Django ORM\")\r\nend\r\n\r\nAnalyze_an_execution_plan(\"Analyze an execution plan\")\r\n\r\nend\r\n\r\nsubgraph Net\r\ndirection LR\r\nHTTP -.-\u003e requests -.-\u003e websocket -.-\u003e Frameworks -.-\u003e API\r\n\r\nsubgraph HTTP\r\ndirection LR\r\nHTTPS(HTTPS)\r\nCORS(CORS)\r\nend\r\n\r\nrequests(requests)\r\nwebsocket(websocket)\r\n\r\nsubgraph Frameworks\r\ndirection LR\r\nFlask(Flask)\r\naiohttp(aiohttp)\r\nDjango(Django)\r\nend\r\n\r\nsubgraph API\r\ndirection LR\r\nREST(REST)\r\nPostman(Postman)\r\nAuthentication(Authentication)\r\njwt_tokens(\"JWT tokens\")\r\nSwagger(Swagger)\r\nFastAPI(FastAPI)\r\nGraphQL(GraphQL)\r\nend\r\n\r\nend\r\n\r\nsubgraph Architecture\r\ndirection LR\r\nWhatIsArch -.-\u003e Principles -.-\u003e Paradigms -.-\u003e Object-oriented -.-\u003e Design_Patterns -.-\u003e Microservices -.-\u003e System_Design -.-\u003e Practices\r\n\r\nWhatIsArch(\"What is?\")\r\nsubgraph Principles\r\ndirection LR\r\n\r\nsubgraph SOLID\r\nSRP(SRP)\r\nOCP(OCP)\r\nLSP(LSP)\r\nISP(ISP)\r\nDIP(DIP)\r\nend\r\n\r\ncoupling_vs_cohesion(\"Coupling vs cohesion\")\r\nKISS(KISS)\r\nDRY(DRY)\r\nYAGNI(YAGNI)\r\n\r\nend\r\n\r\nsubgraph Paradigms\r\ndirection LR\r\nProcedural(Procedural)\r\nStructured(Structured)\r\nparObject-oriented(Object-oriented)\r\nFunctional(Functional)\r\nend\r\n\r\nsubgraph Object-oriented\r\ndirection LR\r\nooInheritance(Inheritance)\r\nEncapsulation(Encapsulation)\r\nPolymorphism(Polymorphism)\r\nAbstraction(Abstraction)\r\nend\r\n\r\nsubgraph Microservices\r\ndirection LR\r\n\r\nDecentralization(Decentralization)\r\nSmart_endpoints_dumb_pipes(\"Smart endpoints, dumb pipes\")\r\nDesign_for_failure(\"Design for failure\")\r\n\r\nsubgraph Messaging\r\ndirection LR\r\nRabbitMQ(RabbitMQ)\r\nApache_Kafka(\"Apache Kafka\")\r\nend\r\nend\r\n\r\nsubgraph Design_Patterns\r\ndirection LR\r\n\r\nObserver(Observer)\r\nDecorator_Method(Decorator)\r\nFactory_Method(\"Factory Method\")\r\nAdapter_Facade(\"Adapter, Facade\")\r\n\r\nCreational_patterns(\"Creational patterns\")\r\nStructural_patterns(\"Structural patterns\")\r\nBehavioral_patterns(\"Behavioral patterns\")\r\nend\r\n\r\nsubgraph System_Design\r\ndirection LR\r\nCQRS(CQRS)\r\nTwo_Phase_Commit(\"Two-Phase Commit\")\r\nLoad_Balanced_Services(\"Load-Balanced Services\")\r\nPattern_of_Distributed_Systems(\"Patterns of Distributed Systems\")\r\nCloud_Design_Patterns(\"Cloud Design Patterns\")\r\nend\r\n\r\nsubgraph Practices\r\ndirection LR\r\nAgile(Agile)\r\nScrum(Scrum)\r\nKanban(Kanban)\r\nend\r\n\r\nend\r\n\r\nsubgraph DevOps\r\ndirection LR\r\ngit -.-\u003e Linux -.-\u003e Development_lifecycle -.-\u003e CI_CD -.-\u003e Containers\r\n\r\nsubgraph git\r\ndirection LR\r\nBasics(Basics)\r\nBranching(Branching)\r\nTools(Tools)\r\nGitHub(GitHub)\r\nend\r\n\r\nsubgraph Linux\r\ndirection LR\r\nInstall(Install)\r\nDirectory_Structure(\"Directory Structure\")\r\nTerminal(Terminal)\r\nInput_Output(\"Input/Output\")\r\nbash(bash)\r\nSystem_administration(\"System administration\")\r\nNetwork_administration(\"Network administration\")\r\nend\r\n\r\nsubgraph Development_lifecycle\r\ndirection LR\r\nGit_flow(\"Git-flow\")\r\ntrunk_based_development(\"Trunk-based development\")\r\nend\r\n\r\nsubgraph CI_CD\r\ndirection LR\r\nContinuous_testing(\"Continuous testing\")\r\nGitHub_Actions(\"GitHub Actions\")\r\nJenkins(Jenkins)\r\nNew_Relic(\"New Relic\")\r\nend\r\n\r\nsubgraph Containers\r\ndirection LR\r\nDocker(Docker)\r\nKubernetes(Kubernetes)\r\nend\r\n\r\nend\r\n\r\nclassDef trainee fill:#6ADA6A, stroke-width:3px\r\nclassDef middle fill:#FF9900, stroke-width:3px\r\n\r\nclass List trainee;\r\nclass tuple trainee;\r\nclass dict trainee;\r\nclass set trainee;\r\nclass array trainee;\r\nclass bytes trainee;\r\nclass deque trainee;\r\nclass heap trainee;\r\nclass range trainee;\r\nclass string trainee;\r\nclass datetime trainee;\r\nclass slice trainee;\r\nclass sort trainee;\r\nclass sorted trainee;\r\nclass listcomprehension trainee;\r\nclass bisect trainee;\r\nclass fmap trainee;\r\nclass ffilter trainee;\r\nclass freduce trainee;\r\nclass String_Built-in_Functions trainee;\r\nclass encode trainee;\r\nclass decode trainee;\r\nclass Read_Write trainee;\r\nclass Text_Binary trainee;\r\nclass JSON trainee;\r\nclass paths trainee;\r\nclass Data_Built-in_Functions trainee;\r\nclass icount trainee;\r\nclass icycle trainee;\r\nclass irepeat trainee;\r\nclass product trainee;\r\nclass combinations trainee;\r\nclass enumerate trainee;\r\nclass yield trainee;\r\nclass decorator trainee;\r\nclass enter_exit_cm trainee;\r\nclass oopBase1 trainee;\r\nclass oop_property trainee;\r\nclass staticmethod trainee;\r\nclass classmethod trainee;\r\nclass slots trainee;\r\nclass Iterator trainee;\r\nclass Comparable trainee;\r\nclass Hashable trainee;\r\nclass Sortable trainee;\r\nclass Iterable trainee;\r\nclass Collection trainee;\r\nclass shallow trainee;\r\nclass deep trainee;\r\nclass objInheritance trainee;\r\nclass Multiple_Inheritance trainee;\r\nclass MRO trainee;\r\nclass reference_counting trainee;\r\nclass garbage_collector trainee;\r\nclass GIL trainee;\r\nclass args_kwargs trainee;\r\nclass lambda trainee;\r\nclass exception_handling trainee;\r\nclass built_in_exceptions trainee;\r\nclass exception_raising trainee;\r\nclass create_task trainee;\r\nclass gather trainee;\r\nclass sleep trainee;\r\nclass run trainee;\r\nclass wait_for trainee;\r\nclass asQueue trainee;\r\nclass Lock trainee;\r\nclass Event trainee;\r\nclass variables trainee;\r\nclass Thread trainee;\r\nclass Pool trainee;\r\nclass Stopwatch trainee;\r\nclass timeit trainee;\r\nclass random_mod trainee;\r\nclass input trainee;\r\nclass Command_Line_Arguments trainee;\r\nclass simple_print trainee;\r\nclass MD5 trainee;\r\nclass AES trainee;\r\nclass pytest trainee;\r\nclass FizzBuzz trainee;\r\nclass BubbleSort trainee;\r\nclass QuickSort trainee;\r\nclass RadixSort trainee;\r\nclass Adjacency_Matrix trainee;\r\nclass Adjacency_List trainee;\r\nclass Linear_Search trainee;\r\nclass Binary_Search trainee;\r\nclass DFS trainee;\r\nclass bigo trainee;\r\nclass divide_and_conquer trainee;\r\nclass Greedy_algorithm trainee;\r\nclass Recursion trainee;\r\nclass Relational_model trainee;\r\nclass Transaction trainee;\r\nclass Isolation trainee;\r\nclass PostgreSQL_benefits trainee;\r\nclass peewee trainee;\r\nclass CREATE trainee;\r\nclass ALTER trainee;\r\nclass DROP trainee;\r\nclass SELECT trainee;\r\nclass INSERT trainee;\r\nclass UPDATE trainee;\r\nclass DELETE trainee;\r\nclass PRIMARY_KEY trainee;\r\nclass FOREIGN_KEY trainee;\r\nclass FROM trainee;\r\nclass WHERE trainee;\r\nclass SET trainee;\r\nclass SQLite_benefits trainee;\r\nclass Syntax_Diagrams trainee;\r\nclass Flask trainee;\r\nclass Consistency trainee;\r\nclass HTTPS trainee;\r\nclass requests trainee;\r\nclass websocket trainee;\r\nclass GitHub_Actions trainee;\r\nclass WhatIsArch trainee;\r\nclass SRP trainee;\r\nclass OCP trainee;\r\nclass LSP trainee;\r\nclass ISP trainee;\r\nclass DIP trainee;\r\nclass coupling_vs_cohesion trainee;\r\nclass Procedural trainee;\r\nclass parObject-oriented trainee;\r\nclass ooInheritance trainee;\r\nclass Encapsulation trainee;\r\nclass Polymorphism trainee;\r\nclass Abstraction trainee;\r\nclass trunk_based_development trainee;\r\nclass StreamHandler trainee;\r\nclass Observer trainee;\r\nclass Decorator_Method trainee;\r\nclass Factory_Method trainee;\r\nclass Adapter_Facade trainee;\r\nclass CQRS trainee;\r\nclass Decentralization trainee;\r\nclass Smart_endpoints_dumb_pipes trainee;\r\nclass Basics trainee;\r\nclass GitHub trainee;\r\nclass Install trainee;\r\nclass Directory_Structure trainee;\r\nclass Terminal trainee;\r\nclass accumulate trainee;\r\nclass chain trainee;\r\nclass compress trainee;\r\nclass dropwhile trainee;\r\nclass takewhile trainee;\r\nclass typing_loc trainee;\r\nclass REST trainee;\r\nclass Postman trainee;\r\n\r\nclass GraphQL middle;\r\nclass bash middle;\r\nclass System_administration middle;\r\nclass Network_administration middle;\r\nclass NoSQL middle;\r\nclass Functional middle;\r\nclass RabbitMQ middle;\r\nclass Scrum middle;\r\nclass Apache_Kafka middle;\r\nclass Docker middle;\r\nclass methmore middle;\r\nclass PostgreSQL_more middle;\r\nclass SQLAlchemy middle;\r\nclass Django_ORM middle;\r\nclass Django middle;\r\nclass FastAPI middle;\r\nclass SQL_standard middle;\r\nclass Analyze_an_execution_plan middle;\r\nclass TensorFlow middle;\r\nclass Keras middle;\r\nclass cryptomore middle;\r\nclass Jenkins middle;\r\nclass Kubernetes middle;\r\nclass Creational_patterns middle;\r\nclass Structural_patterns middle;\r\nclass Behavioral_patterns middle;\r\nclass Architectural_Patterns middle;\r\nclass ELK_Stack middle;\r\nclass Pattern_of_Distributed_Systems middle;\r\nclass Cloud_Design_Patterns middle;\r\nclass New_Relic middle;\r\nclass PyTorch middle;\r\n```\r\n## That’s all for now\r\n\r\nAs you may have noticed, there is no mention of control constructs, IDE installation or virtualenv in this guide. In my opinion, all these topics are very important, but do not constitute the essence of the language, representing something like a binding solution, while the topics discussed in the article, from list to Kubernetes, serve as the full-fledged “bricks”.\r\n\r\nAs a reminder, all the diagrams are made in Mermaid format (you can change the picture just by correcting the text), all the sources are available on [GitHub](https://github.com/amaargiru/pyroad), correct as much as you want, or, of course, leave comments directly in the comments section.\r\n\r\nSeparately, I welcome all beginner programmers. You will come to realize that working 8 hours in a row using your head and not your hands is hard, too. But, no matter what languages you plan to code in and no matter how far you've come in this difficult task, you will definitely upgrade your brain, improve your understanding of the world around you and start to recognize secret passages where you have seen only impenetrable walls before. So it's time to start the IDE, focus a little bit, and start practicing.\r\n\r\nAnd remember: “This is my Python. There are many like it, but this one is mine. My Python is my best friend. It is my life. I must master it as I must master my life.  Without me, my Python is useless. Without my Python, I am useless. My Python and I know that what counts in life is not the words we say, the lines of our code, nor the time we spend at the office. We know that it is the completed tasks that count. We will complete them... My Python is human, even as I'm human, because it is my Python. Thus, I will learn it as a brother. I will learn its weaknesses, its strength, its parts and accessories, its standard library and its infrastructure. I will keep my Python from dangerous misunderstanding or suboptimal use, even as I do my legs and arms, my eyes and heart from any harm. I will keep my Python clean and ready. We will become part of each other. So be it.”\r\n\u001a","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famaargiru%2Fpyroad","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Famaargiru%2Fpyroad","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famaargiru%2Fpyroad/lists"}