Before mentioning any references, want to discuss 2 important things -
- How to learn a new Technology?
Below steps can be helpful for the same(try to find the answers in the below order) -
a) What the Technology is all about? - Wiki, Blogs, Articles, Books etc can be helpful here.
b) When and Why to use it? - google for it and try to do in-depth research and find the rational behind why and when to use it.
c) When and Why NOT to use it? - In general, whenever some new language or some new technology lands up in the market we jump into the conclusion that its the biggest thing ever and we should learn it because some XYZ comp is using it or its trendy in the market.Hold On!Nothing great than learning something new in general but also learn when and why not to use it and on those cases dont go for using it.Never!Before applying any new technology\language analyse meticulously whether that language\technology is suitable for your requirements and the context of the project.And again google is there to help you.
d) How to use it? - Well, once again, google is there to help you.Get some simple, intermediate and then complex samples/examples/ projects about the language/technology and understand them and then try to apply whatever you learned(from there) to your fun or open source or company projects. - How to learn any programming language?
Following steps as given below can be helpful -
a) Learn about the language from Wiki, Blogs, Articles, Books etc.
b) Programming Language Paradigms -
Some important paradigms to be understood which is supported by a typical language(whatever paradigm(s) are supported by the language, e.g. C# supports almost all the paradigms)-
i) Imperative Programming
ii) Object Oriented Programming
iii) Functional Programming
iv) Concurrent Programming(concurrency using thread, process, core & machine and should consider asynchronous programming as well)
v) Meta Programming(including Dynamic Programming)
vi) Aspect Oriented Programming
vii) Reactive Programming(e.g. Reactive Extensions in C# & Lightbend Reactive Architecture available via Java/Scala)
viii) Declarative Programming(e.g. SQL is a declarative programming language)
c) Get hold of some language editor or IDE.As per me, as of this writing Visual Stduio Code seems to be the best editor for almost any language.Say you want to learn Python, download and install Visual Stduio Code and then go through the basics of using VS Code with Python and then go through advanced usage of Python with VS Code.Hopefully after that, everything should be simple.
d) Understand the project folder structure.Real projects are structured to be modular, maintainable, extensible etc.All languages doesn't have the same folder structure.Understand the folder structure specific to the lanaguage e.g. Java has a specific Directory structure.
e) Understand how to run and debug some language based project using your favourite editor/IDE(as mentioned earlier, mine is Visual Stduio Code).First find the entry point of the application/project and then understand the code flow by debugging the code.
f) Build your own fun or open source or company based project in that language.
g) Also important is to understand the build system specific to the language e.g in .NET world MSBuild is the main tool for building a .NET project while for Java there are options like ANT, Maven and Gradle.
N.B. - If you are already proficient in some language , one way to work on projects in other languages is to first thinking of the design and implementaion in the proficient language and then finding the corresponding code constructs in the other language and using them accordingly.And you know what, this approach has a term called T-Shaped Learning.
Now lets turn our attention to our main topic of References.
Lets start with some important resources for cracking language agnostic(& open ended) interviews -
a) Data Structures and Algorithms - Some really good texts to refer are Narasimha Karumanchi's Books(mainly "Data Structures and Algorithms made Easy in Java" and "Algorithm Design Techniques"), Essential Algorithms, Six Small Algorithm Projects with Python, Design and analysis of Algorithms,2/e, Published Books By Anany Levitin, Udi Manber's Introduction to Algorithms(Udi Manber's Seminal paper on Using Mathematical Induction to Design Algorithms), Aditya Chatterjee's Books, LeetCode Problems, GeeksForGeeks(mainly go through "Data Structures" and "Algorithms" within Tutorials), Advanced Algorithms and Data Structures and Awesome Algorithms.
For Divide and Conquer and Dynamic Programming problems, the toughest job seems to be finding the recurrence relation(based on equalities and non-equalities concepts).Also, a majority of the Dynamic Programming problems can be categorized into Optimization problems(a problem of finding the best[min/max] solution from all feasible solutions) and combinatorial problems(expects to figure out the number of ways to do something or the probablity of some event happening).Some other complex algorithmic problems are Graph Theory based problems. Some resources in these respects are Recurrence Relations, Dynamic Programming Patterns (I and II), Top 50 Dynamic Programming Practice Problems, 100+ Dynamic Programming Problems, Dynamic Programming Wiki, LeetCode Graph Patterns, Design Patterns for the Implementation of Graph Algorithms, How To Think In Graphs(Top Graph Theory Resources), Graph data structure cheat sheet for coding interviews, CSES Problems Set
For P, NP, NP-Complete and NP-Hard Complexity Classes refer P, NP, NP-Complete and NP-Hard Problems in Computer Science, NP Completeness Wiki, NP Problems List, Theoretical Computer Science Resources
Using the above Data Structures and Algorithms resources, everythging works fine as long as you are working at in-memory level.But what if the data set is so massive that you cant store in-memory and need to store it in some hardisk(or may be hard disks of multiple machines).Well then, for such scenarios its important to have knowledge of External Memory Algorithms and I/O Efficient Data Structures & Algorithms and for the aforementioned topics, one can refer Algorithms and Data Structures for Massive Datasets, External Memory Algorithms Wiki, Resources by Jeffrey Scott Vitter(I, II and III), Handbook of Massive Datasets, When RAM is Not Enough: Computing with Massive Data Sets and I/O-Efficient Algorithms and Data Structures
While working on real world projects, it might seem that Data Structures and Algorithms are not that much needed but the truth is that there are many fields of Computer Science where these are must and some of these fields are like High Performance Scientific and Engineering Computational Applications, building AI/ML/BigData Frameworks, projects related to IEOR Courses @ IIT Bombay etc.
*Parallel & High Performance Computing - For Parallel & High Performance Computing, one can refer Shared Memory Vs Distributed Memory, Introduction to Parallel Computing, Parallel Computation Patterns, Selim Akl's Publications, Parallel and Distributed Computation: Numerical Methods, Parallel and High Performance Computing, OpenMP Fundamentals, Some Good Resources for OpenMP and MPI, OpenCL vs CUDA(I & II) and Some good CUDA resources.Although SOAP based services and Restful services(in .NET or Java or some other language) can be used for Distributed Memory based systems but when you ask for performance nothing is near to MPI(in C/C++). Also .NET's Task Parallel Library or some Java Parallel Programming constructs may seem similar to OpenMP but again in terms of performance, say for processing a machine with 1000 cores, OpenMP shines like anything.For Fortran, it seems the best option is to use the language in-built parallel/distributed structure named co-arrays.
*Competitive Programming - For Competitive Prgramming, one can refer IOI Recommended Reading, Awesome Competitive Programming, Indian Computing Olympiad Past Problems, Looking For a Challenge? and IOI Past Problems.
For an extensive list of Resources on Data Structures and Algorithms, one can refer Resources for Problem Solving,Discrete Maths,Data Structures,Algorithms and Cracking Interviews of firms like Microsoft,Facebook,Google,Amazon etc.
b) OOPs, Software Patterns and System Design - For Design Patterns, one can refer Head First Design Patterns, Elemental Design Patterns and Refactoring to Patterns. For an extensive list of resourses on OOPs and Patterns, refer Patterns Literature.
Again from the Systems Design perspective, some good resources are like Udemy's Software Architecture and Technology of Large-Scale Systems Course, Awesome System Design, System Design Resources, Gainlo's System Design Interview Questions, Object Oriented Design Questions,Design Questions,Software Design Questions, System Design Interview Questions, Large Scale Computing Questions, Trading System Design, System Design Cheatsheet, CPU Cache, Mechanical Sympathy, Operating System Support for Warehouse Scale Computing.Some related youtube videos are Narendra L's playlists and Tushar Roy's playlists.
Now for the DDD Project, the references used or were supposed to be used are as follows(not that everything mentioned below is referred to build the DDD framework, but atleast some bits of each of these awesome resources mentioned below have been referred or was supposed to be referred) -
- Patterns, Principles and Practices of Domain Driven Design.
- JavaScript Domain Driven Design.
- Practical Domain-Driven Design in Enterprise Java.
- Coding for Domain Driven Design.
- Domain Driven Design Wiki.
- Some very good samples to look out for DDD are Domain-Driven Design Using a Trading Application Example, DDD E-Commerce Sample, Domain Driven Design Using SpringTrader, Click's Hexagonal Domain Driven Architecture and Reactive DDD/CQRS using Akka. Some other good open source DDD apps are like- I and II.
- CQRS Wiki, How Eventuate Works, Rinat Abdullin On CQRS, CQRS Myths, When To Avoid CQRS and CQRS Examples.
- If one wants to think of any imaginable data source as Repository then at least for the query side it's better to have a IQueryable provider for the same (at least to use this framework seamlessly). For an exhaustive list of open source IQueryable providers, one can visit Linq to Everything (well, it's almost EVERYTHING).If some imaginable data source is not mentioned in the afore-mentioned list then one can build his/her own IQueryable provider and hopefully the articles viz. LINQ: Building an IQueryable provider series, Building Custom LINQ Enabled Data Providers, Creating LINQToTwitter library using LinqExtender and Writing A Custom LINQ Provider With Re-linq can be helpful in doing the same. And if anyone builds any LINQ to Something (or "Anything") provider, then please don't forget to share it with the world. Some other intriguing reads on LINQ are Analytic Functions using LINQ, SqlDependency Based Caching of LINQ Queries, Dynamically evaluated SQL LINQ queries, Building LINQ Queries at Runtime in C# and Specification Design Pattern.
- Again for Unity based DI/IoC container, one can refer Dependency Injection with Unity and Microsoft Unity Succintly.
- Almost Anything and Everything about ASP.NET Web API(including ASP.NET WEB API 2: HTTP MESSAGE LIFECYLE), Web API Versioning and Designing Evolvable Web APIs with ASP.NET(source code). To learn the basics of ASP.NET MVC one can go through ASP.NET MVC Interview Questions.Also one can go through ASP.NET MVC Page Life Cycle and ASP.NET MVC Pipeline And Extensibility as well to understand the ASP.NET Page Lifecycle and ASP.NET MVC Extensibility. Also do have a look on Building Custom Owin Middlewares and Building OAuth2.0 using Owin series(to get insights into SSO using JWT for cross domain one can refer this SO article).For API documentation one should use Swagger and a good resource w.r.t ASP.NET Web API is Swagger and ASP.NET Web API.
- WCF Basics, Programming WCF Security, WCF Versioning(Data Versioning & Service Versioning) and SOA Apps Using WCF. Also, to build BPM solutions using Windows Workflow Foundation, one can refer WWF docs. Also have a look on one of the most important topic within WCF(which most of us neglect), which is WCF Extensibility(series). Some other important things to seek are WCF with SSL, Configure a Port with an SSL Certificate, IIS Apppool Identity access to certs, WCF Scalability, WCF Dynamic Proxy, Creating WCF ChannelFactory, Unity.WCF, WCF Proxy and IoC, WCF Service Resolution Container Extension and WCF Tracing.
- Reasons to use ORM, EF 6 Docs, EF Inheritance, EF Fluent API Relationships, EF DBCommand Interceptors, EF Migrations, EF Concurrency,Dapper vs EF and Dapper Docs.
N.B. -> Fastest performance is achieved using ADO.NET and for that, ADO.NET Part 1 & ADO.NET Part 2 can be referred. - SignalR Docs, SignalR Video Streaming and SignalR with DB.
- Top JavaScript Frameworks in 2020: How To Make Your Choice, Fullstack JS, JQuery Interview Questions, JS ES6, JS Generators, The many faces of "this" in JS, Pro Single Page Applications and ASP.NET SPA Docs for SPAs.
- FluentHTML, Fluent Bootstrap, Fluent HTML for PHP, HTML Object and Tag Builder
- Offline First Web Development and Building real-time collaborative offline-first apps with React, Redux, PouchDB and WebSockets.
- MS Guidance on Web Development Best Practices, Google's Web Fundamentals and Google Performance Suggestions.
- Guide to Semantic Web and Mastering Structured Data on the Semantic Web.
*Also if needed, ASP.NET WebHooks Succintly, Nuget In House Succintly, MSIX Succintly, C# Code Contracts Succintly, T4 Succintly, Async OOP, Microsoft Extensibility Framework and Microsoft Sync Framework might be referred.
**If at all the DDD codebase is migrated to .NET Core then hopefully ASP.NET Core Documentation and Porting to .NET Core will be pretty much helpfull.But currently lots of .NET Framework stuffs are not supported by the current .NET Core version as verified by .NET Portability Analyzer Tool.Also don't have any plans to have a mix and match of .NET Framework and .NET Core environment working together since that would have its own challenges(didn't do any thorough analysis though) and the whole point of using .NET(wholly) for LINUX/MAC is missing in such an approach(although one might suggest to deploy .NET Framework code as a Web Service deployed in a Windows machine while the .NET Core code deployed in some LINUX/MAC machine consuming the Web Service but for sure, that would have its own challenges).Anyways, that's secondary and so MIGHT be taken care at some later point of time.Some other helpful links w.r.t .NET Core are Awesome .NET Core and Asp Net Core Open Source Projects.
*** One of the best way to learn SPA, REST/MicroServices and DDD (including CQRS and Event Sourcing) is to grab some existing good open source projects and then gather the requirements (from the source code), analyze the requirements, architect/design/implement the requirements (along with unit/integration/acceptance testing) using principles of SPA, REST/MicroServices and DDD (may be if needed, can apply parts/whole of the DDD Framework for the same). Some intriguing open source projects in this regard are -
a) ASP.NET - ASP.NET Samples.A good article with regards to comparison of various ASP.NET Technologies is WEB FORMS, MVC, SINGLE PAGE APP, WEB PAGES COMPARISON.Also its very important to understand Server Side Rendering and Client Side Rendering to understand the differences between approaches of ASP.NET MVC and WebForms w.r.t that of Web API alongwith some JS Framework and for that one can refer Rendering On the Web and JavaScript SEO: Server Side Rendering vs. Client Side Rendering.My thumb rule is to use ASP.NET WebForms(if its a brownfield app) or ASP.NET MVC(if its a greenfield app), if server side rendering is required(may be because of complex UI rendering logic or some usage of server controls tightly binded to DB) while if Client Side Rendering is required then to opt for ASP.NET WEb API alongwith some recent JS Framework like React or Angular or Vue or normal JS(alongwith JQuery).
b) E-Commerce - NopCommerce, SmartStore.NET and Virto Commerce.
c) Trading - StockSharp, QuantConnect's Lean, Marketcetera and Modulus.
d) Telecom Billing - jBilling(the Cloud Computing billing model works somewhat in similar lines).Managing Recurring Events In a Data Model is a good read on a DB design approach for handling recurring events(any Billing system has some portions of it which can be visualized as recurring events).Also have a look into the related topics of Dynamic Pricing, Pricing Strategies and Price Optimization(if possible, may be build some open source Pricing Framework).
e) CMS - DotNetNuke, Orchard and Umbraco.
f) CRM - SplendidCRM, ASP.NET CRM and Coevery.
g) Personalization - My Web Pages Starter Kit.
h) Web Portal - DropThings and ASP.NET Portal Starter Kit.
i) Social News - Kigg.
j) Blog - BlogEngine.NET.
k) ECM(Enterprise Content anagement) - SenseNet.
l) SOA - .NET Stock Trader.
m) Workflows(along-with some Utilities) - NeoVolve.Toolkit.This project is more of a toolkit, the utilities and concepts of which can be used to build REST/DDD based Workflow projects.Also watch out for WWF based PageFlow samples like Rule Driven Pageflow / Workflow, ASP.Net Page Navigation using Workflow 4.0 and the WWF based Rehosting project viz. - Rehosted Workflow Designer.
n) ERP - WebVella, MixERP, MERP and Frappe.
o) Concurrency - Parallel Programming Samples and Parallel Programming Extras. Again, please note that these projects are not mentioned for learning SPA or REST or DDD principles directly but the underlying principles can be used for some REST/DDD based projects at the server side.
p) Monitoring - Wolfpack Distributed System Monitoring.Again, this is not mentioned so that this monitoring project can be transformed into a project following all DDD principles but just mentioned so that people(who are not aware of this tool yet) can be aware of this awesome open source distributed system monitoring tool.
q) Some other stuffs(which might be useful) - Some other good code galleries(or projects) to watch out for are ASP.NET Core Samples, .NET Core Samples, .NET Framework Technologies Samples, MicroDot(Samples), Hibernating Rhinos Git Repositories, iDesign's Downloadables, Particular Software's Git Repositories, Wintellect's Git Repositories, HDInsight Git Repository, Microsoft Mobius(somewhat like a .NET port of Apache Spark) etc.
Other Good Resources – Most of the references mentioned above are really good(especially for developing the DDD Application Framework) but the resources mentioned below can hopefully make one a better Coder/Designer/Architect/Systems Programmer –>
- Coding ->
• Some good resources in .NET space are .NET Docs, Basic .NET Interview Questions, Relationship between CTS and CLS, C# in a Nutshell, C# in Depth, CLR Via C#, LINQ 101, Dependency Injection Principles, Practices, and Patterns, AOP in .NET(Aspect-Oriented Programming, Interception and Unity 2.0 & Run-time AOP vs Compile-time AOP), MetaProgramming in .NET, Concurrency in C# Cookbook, Concurrency in .NET, .NET Reactive Extension Resources, Akka.NET Resources, Awesome .NET and .Net libraries that make your life easier.For some intriguing Multithreading articles, refer C# Sharding and Multithreading, PetriDish : Multithreading for Performance in C# and Common Multithreading Mistakes in C#. For .NET Interoprability one can refer Native Interoperability, Exposing .NET Core Component to COM, 32 bit vs 64 bit w.r.t .NET Interoperability and Some .NET Interoperability Resources.
• One very important programming language paradigm is Functional Programming and although inherently functional languages like JavaScript has been moving towards Object Orientation(ES6 and ES7) but the irony is that the traditional Object Oriented languages like Java, C# have been moving more towards the functional side and for functional approaches, one can refer(mainly JS and .NET based language resources) - Grokking Simplicity, Grokking Functional Programming, So you want to be a Functional Programmer, Functional Programming in C#, LINQ and Functional Programming via C#, Learning F#, Functional JavaScript, Functional Programming in Javascript and Persistent DataStructure.For Patterns on Functional Programming, refer FP Design Patterns, Where are all the Functional Programming Design Patterns(Check for the answer by Corbin March) and Does Functional Programming Replace GoF Design Patterns.
• Also do refer The Best Programming Languages for Each Situation to get a gist of the right language to be used for the job. Some best of the best resources, to learn different language intricacies, can be found at Mark Summerfield's Recommended Books and Notes for Professionals Books. One of the best methods to understand and learn a programming language is Project Based Learning and to do that, some good resources are Mega Project List, Learn Programming Project-Based: Build-Your-Own-X, Open Source Project Ideas and App Ideas.
Some Language Specific Resources are as follows -
i) Javascript and Node JS(& other JS Frameworks) - For JS, the best resource is You dont know JS series. Other
good resources are Learning JavaScript Design Patterns,Node.js Design Patterns, Node.js Architecture slides from Slideshare, Awesome JS(I and II), Awesome Node JS(I and II), Good Open Source Node JS Projects and A beginner’s guide to making Progressive Web Apps.
Some helpful links w.r.t Angular, React and Vue can be Choosing the “Right” JavaScript Library/Framework for Your Application, Angular vs ReactJS vs Vue.js with Examples and Demos, Udemy's React JS, Angular & Vue JS - Quickstart & Comparison Course, Udemy's Angular Course, Udemy's React Course, 10 Angular and TypeScript Projects to Take You From Zero to Hero, Github Realworld Projects, Angular Docs, React Docs, Angular Open Source Projects, Awesome Typescript Projects and React Open Source Projects.For testing Angular and React projetcs, one can use Protractor and Enzyme respectively.
ii) Java - Specifically for Java, one can refer Learn Core Java, Learn Java 8 and Functional Programming, Learn Java Virtual Machine, Garbage Collection, and Performance, Core J2EE Patterns, Spring Framework Resources for Experienced Developers(including Spring Tutorial & Spring Docs), Hibernate Resources for Java Developers, Integrating Java With C++, Java InterOp Mini Series, Java Interview Questions, Java Puzzlers and Awesome Java.
iii) Assembly/C/C++/Fortran - These languages are the best from System Level performance perspective.Assembly/C/C++ are still used in
most Systems Programming environments(including Embedded Systems).For Assembly one can refer Assembly Language Succintly and Awesome-ASM.For some good C resources, refer Project Based tutorials in C, Awesome C(I,II,III) and Domain Driven Design in C.For some good C++ resources, refer Good Open Source C++, Awesome C++(I, II and III) and DDD in C++.
Fortran might seem to be an obsolete language but its actually still being used for scientific and engineering numerical
applications(especially for distributed numerical computation based apps, infact some financial institutions use it for their trading apps as well) and for Fortran, some good resources are Modern Fortran, Modern Fortran Explained and Awesome Fortran.
iv) Python - Awesome Python, Awesome Python Applications and Dynamic DDD seems to be some really good resources for Python.
v) Erlang/Elixir - Most of the languages work well from Concurrency and Availability perspective but what if you want around 5 9s of Availability(like some Telecom projects).Say hello to the Erlang/OTP based language viz.Elixir.For Elixir one can refer Elixir Succintly, Elixir in Action, The Little Elixir and OTP Guidebook and Phoenix in Action(Phoenix is an Elixir based Web Framework).
• And for Unit Testing, The Art of Unit Testing seems to be the best resource.For BDD using .NET refer Automation with Specflow and Specflow Best Practices.For actual Functional Testing tools one can use any of these tools as per requirements and context.
• For SQL one can refer Joe Celko's Books, Introduction to Analytic Functions, Execution Plan Basics, SQL Server Interview Questions I & II, CTE vs Temp Table vs Tmp Variable, Rank vs Dense_Rank vs Row_Number, SQL Partition By, Introductory SQL Big O Complexity Analysis - I & II, Securing connections to SQL Server with TLS, SQL Server Connection String in ADO.NET, MySQL .NET Connection String Options, SQL Server Performance Tuning & Design and SQL Server MVP Deep Dives - Vol I & Vol II.
- Design and Architecture -
• Some good resources in general for this space are Clean Code Cheat sheet, Java Design Patterns, Enterprise Software Patterns,Legacy Displacement Patterns, Microsoft Patterns and Practices, Workflow Patterns, UML Guide, Concurrency Patterns, UML Notations, RDBMS Data Modelling, Balaji Ramarajan's Digital Series, .NET Architecture Guides, Architectural Patterns, Software Architect's Handbook, Enterprise Application Architecture with .NET Core, Software Architecture with Spring 5.0, Architecting Data Intensive Applications, Design - Build - Run: Applied Practices and Principles for Production Ready Software Development, Release It!, Architecting Extremely Large Scale Web Applications, O’Reilly’s Beautiful X Series, Anything from WSO2(is just awesome), The Architecture of Open Source Applications, Application Architecture Posts by Martin Fowler, Application Integration Posts by Martin Fowler, Enterprise Architecture Posts by Martin Fowler, Practical SOA For the Solution Architect, O’Reilly’s Software Architecture Series,High Scalability Recommened Books, Architectural Styles and Patterns (including Hexagonal Architecture, Onion Architecture and Microkernel Architecture), Multi Layered Architectures in .NET, Are you a Software Architect, Concurrent Programming for Scalable Web Architectures, Enterprise Architecture Frameworks, Gartner's Hype Cycle For Enterprise Architecture, Gartner's Hype Cycle For Emerging Technologies, ThoughtWorks' Insights and ThoughtWorks' Technology Radar.Another great resource from architecture point of view in the .NET world is MS Patterns and Practices Recommendations.
A framework(infact the most famous) related to Enterprise Architecture is TOGAF and resources related to that are TOGAF Value, Enterprise Architecture for Dummies - TOGAF 9 enterprise architecture overview, TOGAF Udemy Courses(Part 1 & Part 2).
• Some good resources in this space from the Software Engineering perspective are C4 Model, Cracking the IT Architect Interview, Differences Between Architecture Roles, Architecting High Performing, Scalable and Available Enterprise Web Applications, Just Enough Software Architecture(some recommended texts by this author).
An important aspect of Software Architecture in general is (NFRs)(Non Functional Requirements) and some good resources related to that are Attribute Driven Design and Mastering Non Functional Requirements.Some resources for very specific NFRs are as mentioned below -
a) Performance - .NET Framework Performance, Awesome .NET Performance(for overall website performance, refer My Web Site is so slow… And I don't know what to do about it!, 8 ways to improve ASP.NET Web API performance) Other Performance texts that can be referred are Fast ASP.NET Websites, ASP.NET Site Performance Secrets, Learning .NET High-performance Programming, C# 7 and .NET Core 2.0 High Performance and ASP.NET Core 2 High Performance.
A concerning area related to performance is High CPU Usage.High CPU Usage may happen because of various reasons like a program gets stuck in an infinite loop or encounters an unexpected error or some virus or adware infection has occurred, which should be addressed immediately.Some pointers in this respect(not exhaustive) w.r.t .NET code are How to Troubleshoot IIS Worker Process (w3wp) High CPU Usage, How to handle and avoid high CPU, Tight Loop Issue and Resolution, High CPU usage in C# multi-threaded code, Multi-threaded C# Application hitting High CPU Usage, C# Moving panel with mouse causes high CPU usage, Named pipes in service causes high CPU usage etc.
Memory Leaks in code can be another big issue.Some pointers in this respect w.r.t .NET code are Find, Fix, and Avoid Memory Leaks in C# .NET: 8 Best Practices, Detecting .NET applicarion memory leaks, Memory leaks in .Net applications. Yes – they happen all the time…, Everybody thinks about garbage collection the wrong way, Memory Usage Inside the CLR, The Stack, The Heap And The Memory Pitfalls etc.
Some performance tools one should watch out for are mentioned here.
b) Security - An important aspect of any application development is Security and the best resources w.r.t Security seems to be PortSwigger's Web Security Tutorials(including Burp Suite Issue Definitions), OWASP Security Cheatsheets series, Common Weakness Enumeration and WebAppSec.An important aspect of Security is Cryptography and some good resources related to this topic are Cryptography in .NET Succintly, Application Security in .NET Succinctly, Hybrid Encryption(I & II), Cryptography Engineering, SSL/TLS, Good SSL/TLS Resources, SSL Formats, Implementing Protected Configuration With Windows Apps and Key Management.Some other good resources on Security from actual testing perspective during development itself are Application Security - An Easy Start, Automated Security Testing in a Continuous Delivery Pipeline, .NET Penetration Testing and 10 Types of Application Security Testing Tools: When and How to Use Them.Another aspect related to Security is Ethical Hacking and for that some of the best resources are Ethical Hacking Courses, Certified Ethical Hacker (CEH 10) A to Z Course and No Starch Press' Security Texts.
For Secret Management, one can refer Safe storage of app secrets in development in ASP.NET Core, The best way to store secrets in your app is not to store secrets in your app, How to avoid storing secrets in the source code?, How to safely manage passwords in .Net applications and Secret Management Architectures.
c) Scalability - 5 Best High Scalability Books For Web Architects, Architecting for Scale, Scalabilty Patterns.
d) Availability - Design Patterns for High Availability, 5 tips for improving availability, Maintaining highly available applications, Reducing planned and unplanned downtime, High Availability and Disaster Recovery, High Availability IT Services, Blueprints for High Avaiability and Designing High Availability Systems: DFSS and Classical Reliability Techniques with Practical Real Life Examples.
e) Reliability and Resilience – Chaos Engineering, DevOps vs Site Reliability Engineering, Site reliability engineering (SRE): A simple overview, Site Reliability Engineering, Resilience Engineering, A typical SRE Architect Job Description, Site Reliability Engineering on AWS, Database Reliability Engineering, The path to resilience, Resilient software design in a nutshell, Practical Resilience, Building Resilient Serverless Systems and Resilient Distributed Systems.
N.B. -> Just to remind you that all the above important NFRs should not only be handled in Application code but also should be handled at Infrastructure level.
- Microservices/SOA/API Management, Infrastructure/Cloud and DevOps -
•Some good resources w.r.t Microservices are When to use Microservices, When not to use Microservices, Run ASP.NET Core Microservices, Microservices Implementation Journey, Microservices Architecture, Microservices with .NET, The Evolution of Scalable Microservices, Microservices: From Design to Deployment, a Free Ebook from NGINX, Microservices Authentication and Authorization, Microservices : Flexible Software Architectures, Microservices : A practical Guide, Production Ready Microsoervices, The Tao of Microservices, Spring Microservices in Action, Building MicroServices and Migrating to Microservice Databases: From Relational Monolith to Distributed Data
2 important frameworks related to Microservices are SteelToe and Istio. For SteelToe refer SteelToe Docs while for Istio refer Istio Succintly and Istio Docs.
From perspective of SOA some good resources are What is SOA, Service Design Patterns, SOA Patterns, SOA Governance In Action and SOA Security.
Again from perspective of API Management, one can refer Enterprise API Management, API Management, Continuous API Management and Open Source API Management Tools.
•Some good resources w.r.t Infrastructure in general are 6 Strategies for Application Deployment, Designing IT Solutions, IT Infrastructure Architecture Blog, Infrastructure Design Book and Infrastructure Design Patterns.
•Some good resources w.r.t Cloud Computing are Udemy's AWS Essentials Course, AWS VPC Subnets – in Layperson’s Terms, IP Subnetting from CIDR Notations, Learn how to secure your VPC using an AWS Network ACL and subnets, Udemy's Stephen Maarek's AWS Courses, Udemy's Jon Bonso's Practice Exams, Syncfusion's Succintly Series on Cloud, Azure for Architects, Azure Application Architecture Guide, Learn to Develop for Cloud with Pivotal Cloud Foundry, Cloud Foundry in Production, Pivotal Cloud Foundry (PCF) Developer practice exams, Hybrid Cloud for Architects, Designing Private and Hybrid Clouds -Architectural Best Practices, Private Cloud Showdown, Hybrid Cloud Options Compared, Multi Cloud, Multi-Cloud for Architects, Cloud Academy's Cloud Design Patterns, Implementing Azure Cloud Design Patterns, Implementing Cloud Design Patterns for AWS, Reliability and Resiliency on AWS, Building Microservices with the 12 Factor App Pattern on AWS, Beyond the 12 Factor App: Exploring the DNA of Highly Scalable, Resilient Cloud Applications, Cloud Computing and Distributed Systems, Anatomy of a cloud storage infrastructure, How does Azure work?, Azure Stack Architecture, Azure Virtual Machine Internals – Part 2, Build your Own Cloud and 7 essential open-source tools for cloud management.
For Serverless Cloud Computing one can refer Serverless Computing, When (and why) not to go serverless, Udemy's AWS Lambda Serverless Architecture Course, Azure Serverless Succinctly, Integrating Serverless Architecture Using Azure Functions, Cosmos DB, and SignalR Service, Serverless Architectures on AWS, Serverless Design Patterns and Best Practices, Serverless vs PaaS: Is Serverless the New PaaS? and When On-Premise Serverless Beats the Cloud.
For Multitenant SaaS one can refer Inevitability of Multi-Tenancy & SAAS in Product Engineering, ASP.NET Multitenant Applications Succinctly, Building multi-tenant ASP.NET Core Applications with the Orchard Core Framework, Decent Open Source Multi tenant Open Source CMSes, Developing Multi-tenant Applications for the Cloud on Windows Azure, Service Orchestration as Organization: Building Multi-Tenant Service Applications in the Cloud, Things to keep in mind while developing Multitenant apps, Architecting a Multi-tenant Application and Patterns of multi-tenant scalability.
•For DevOps, one can refer DevOps Wiki(Tools in Practice), DevOps and Continuous Delivery Reference Architectures (including Nexus and other popular tools), DevOps and Continuous Delivery Reference Architectures - Volume 2, Jenkins Wiki, Jenkins - Step by step guide to set up master and agent machines on Windows, Jenkins Docs, Jenkins Alternatives for CI, Chef vs Puppet vs Ansible vs Saltstack: Which Works Best For You?, Ansible Wiki, Ansible for the Windows Admin, How to install Ansible on Windows?, Ansible and Windows Integration, Ansible Docs, Chef Wiki, Getting Started with Chef on Windows Server, Chef for Microsoft Windows, Chef Docs, DevOps Artifacts - Artifactory, Nexus, Maven Artifact Repository, and Apache Archiva, Docker(Virtualization vs Containerization - can be used together as well), Deploying .NET Framework applications with Docker, .NET Core application deployment, .NET Core and Docker, Kubernetes(Kubernetes in Simple Words), Running ASP.NET Applications in Kubernetes — A Detailed Step By Step Approach, Automated Delivery of ASP.NET Core Apps on On-Prem Kubernetes using Jenkins, Ansible for Kubernetes, Terraform, Why we use Terraform and not Chef, Puppet, Ansible, SaltStack, or CloudFormation and HashiCorp's Cloud Infrastructure Automation.Other good texts w.r.t Docker and Kubernetes are Using .NET Core, Docker, and Kubernetes Succinctly, Docker Succinctly, Kubernetes Succinctly and Kubernetes Patterns.
For SQL Scripts deployment, DacPac seems to be the best option and for that one can refer Microsoft and Database Lifecycle Management (DLM): The DacPac, Data-tier Applications, SQL Server Database Project - SSDT - Continuous Delivery and Deploy Database Changes using Data-Tier Application Package [DacPac], Continuous Integration with Jenkins, SQL Server and Windows Containers and Convert VS 2010 Database Project to SSDT and Automate Publishing with Jenkins.
N.B. - In an Enterprise, Jenkins or Ansible or Chef might be already setup via master slave architecture for different environments viz. Dev, SIT, UAT, Pre-Prod, Prod etc and one might just need to setup scripts for communication between master and slave and setup the client nodes.Check the onboarding documents(if available) for the same.
- IoT(Internet Of Things) -
For IoT, one can refer Getting Started with the IoT, NPTEL's IoT courses(I, II, III and IV), Design Patterns for IoT, IoT and Edge Computing for Architects, Architecting the Internet of Things, Awesome IOT(I & II), Enterprise IoT, Architecting the IoT, Build Your Own IoT Platform, Building Arduino Projects for the Internet of Things, Windows 10 for the Internet of Things, Demystifying Internet of Things Security, The IoT Hacker's Handbook, Practical Industrial Internet of Things Security, Secure and Smart IoT : Using Blockchain and AI, Architecture for IOT applications, IoT Reference Architecures, CQRS and Event Sourcing for IoT, My Driving IoT Reference Architecture, Microsoft Azure IoT Reference Architecture, Azure IoT Reference Architecture, WSO2 Reference Arcghitecture for IoT, A Context Aware Computing Based Reference Architecture for the Internet of Things and Internet of Things: Principles and Paradigms.
2 topics related to IoT are Networking and OEM based Embbedded Systems.
For Networking one can refer Head First Networking, Forouzan's Network Books, Awesome Networking, C# Network Programming, Hands On Network Programming with C# and .NET Core, TCP/IP Sockets in C# and Multicast Sockets.Related to Networking is IoT Connectivity and to get an overview of the technologies enabling IOT Connectivity, one can go through Comparison of Wireless Datra Standards, IOT Communication Protocols, Connecting IoT Devices to Cloud Services, 6 Communication Protocols Used by IoT, IoT Standards and Protocols, Internet of Things (IoT) Protocols and Connectivity Options, Connectivity Technologies for IoT, Connectivity and networks for the Internet of Things data deluge, Choosing IoT‐connectivity?, The future of connectivity: Enabling the Internet of Things etc.Also go through some wireless topics like Mobile Computing, Wireless and Mobile Networks, Wireless Network Programming Books suggestions, WiFi Network with Managed wiFi and Managing wireless network connection in C#.Also do have a look on Awesome SDN (I & II), Open Source Networking Projects and Open Source Networking Tools.
For Embbedded Systems one can refer Raj Kamal's Embedded Systems, NPTEL's Embedded Systems Course, Embedded Artistry(Design Patterns Catalogue, Resources & Suggested Resources), IIT Bombay's Embedded Systems Course, Jonathan Valvano's Courses, Raspberry Pi Projects for Dummies, Programming for Embedded Systems, Hands-On Embedded Programming with C++17, Embedded Systems Architecture, Embedded Systems Architecture for Engineers and Programmers, Awesome-Embedded,Building Embedded Systems, Reusable Firmware Development, 5 Best-Selling Windows IoT Core eBooks, Pro Linux Embedded Systems, Building Embedded Linux Systems, Mastering Embedded Linux Programming, Linux Kernel in a Nutshell, Linux Device Drivers, Embedded System Design Patterns, Embedded Control Systems Design/Design Patterns, Design Patterns for Embedded Systems in C, UWP Docs, Xamarian. Forms Docs, MFC Docs, Nano Framework, Understanding Embedded memory Systems, Embedded Database etc.
N.B. -> To design and implement the hardware & firmware for an Original Equipment, knowledge of Computer Organization, Comuter Architecture and Systems Programming(alongwith Operating Systems & RTOS) might be needed and for these one can refer NPTEL's Computer Architecture and Organization Courses(I, II, III, IV, V, VI), Computer Arithmetic, Computer Architecture, Computer Organization & Embedded Systems, Computer Architecture : A quantitative Approach, Computer Systems: A Programmer's Perspective, Nand to Tetris, System Software, NPTEL's Operating System and RTOS Courses(I, II, II, IV, V), Think OS, Best OS Resources, Linux Systems Programming, Hands-On Systems Programming with Linux, Best RTOS resources etc. A good excercise w.r.t Operating Systems would be solve the problem mentioned here and a solution for the same is available here.Put some real time constraints on the aforementioned problem and try to solve it and ultimately you will end up building a real time system on your own. Another good resource to build your own RTOS is Udemy's Build Your Own RTOS Course(I & II).
Also go through some basic Embedded Sytems/OS/RTOS related Q&As like 8-bit vs. 32-bit MCU: Choosing the Right Microcontroller for Your PCB Design, When do we need an OS in Embedded System Design, Differences between General OS and RTOS, What is a boot Loader and when do we need one?, BSP vs Device Drivers etc.
One more topic related to IoT is Wireless Sensor Networks and for that one can refer Best WSN Texts, Building Wireless Sensor Networks Using Arduino and Hands-On Wireless Sensor Networks with ESP32.
Antother topic of interest in IoT field is Audio and Video Processing and Communication and for that one can refer RTP in C#.
And the last(but by no means the least) important topic w.r.t IoT is Pervasive(Ubiquitious) Computing and for that one can refer Pervasive Computing: Technology and Architecture of Mobile Internet Applications and Pervasive Computing : The Mobile World
- Blockchain & Distributed Systems- Some good resources on this topic are Grokking Bitcoin, Henry He's Blockchain Articles, Awesome BlockChain, Blockchain Patterns, General Blockchain Applications, To Blockchain or Not To Blockchain, BlockChain Applications - A Hands On Approach, Blockchain Programming in C# and Microsoft's CoCo Framework.A subject related to Block Chain is Distributed Systems and for that, one can refer resources like Distributed Systems Patterns, NPTEL's Distributed Systems Courses(I, II, III), Apache Kafka - Core Internals, I Heart Logs, Designing Data Intensive Applications, Database Internals, Distributed Computing for Fun and Profit, Introduction to Reliable and Secure Distributed Computing, The Science of the BlockChain and Coursera's Cloud Computing Splialization.3 topics related to Distributed Systems(& to some extent to Blockchain) are P2P, Distributed Hash Table and Streaming. For P2P one can refer Best P2P Resources, for Distributed Hash Table some good resources are Kademlia Wiki, The Kademlia Protocol Succinctly while for Streaming one can refer Awesome Streaming, Streaming Data, Making Sense of Streaming, Streaming Systems, LMAX Disruptor, LMAX Disruptor Performance, Streaming Algorithms and Data Structures and WSO2's Stream Processor.
Sometimes you might need to create a language for your domain(something similar to compiler or interpreter construction) and such languages are called Domain Specific Languages.Some good references to solve any kind of Compiler Construction type problems or to build your own cool Programming Construction toolkit(which will let you learn Domain Specific Languages) are -
- A Guide to Parsing: Algorithms and Terminology
- Implementing Programming Languages using C# 4.0
- Implementing a Custom Language Succinctly
N.B. -> A sequel to the above text is Writing Native Mobile Apps in a Functional Language Succinctly - NPTEL's Compiler Construction Related Courses(I, II, III, IV, V, VI and VII)
- Domain Specific Language in .NET
- Language Implementation Patterns
- Domain Specific Languages
- A Catalog of Patterns for Program Generation
- Roslyn Succintly, Awesome Roslyn and Roslyn Samples and Walkthroughs
- Masterminds of Programming
- Some other good (.NETish) resources are like Easy way to create a C# lambda expression from a string (with Roslyn), Evaluating mathematical expressions with custom script functions, Dynamic compilation as a very fast mathematic parser in .NET and Building a Dynamic Business Rules Engine.
For videos related to different fields of Computer Science and Engineering, refer CS Courses with Videos
N.B. -> It’s not that I have read/viewed everything mentioned above but yes, I have read/viewed a few of them (partially or completely) and many are yet to be even started(for reading) but all the resources mentioned above are some of the best resources(as per my interaction with some beautiful minds and my own exploration). Also, something not mentioned in the above list doesn't mean that it's not good - only that I am not aware of(or not my preference).