Required courses for Software Developer

These are the courses that I have recommended to my team members. I think these courses are minimum that you should go through to become a complete software developer.

Due to current corona virus crisis if somebody is looking for courses to know about programming and to become a software developer, then they can certainly look for these courses.

However, this list is not complete. I will continue to add new courses which will greatly enhance the skill of a software developer. Let me know if something is missing here.


Fundamentals

Mathematics For Computer Science: https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-042j-mathematics-for-computer-science-fall-2010/index.htm
Fundamentals of Computing: https://www.coursera.org/specializations/computer-fundamentals
Introduction to Computer Science and Programming using Python: https://www.edx.org/course/introduction-to-computer-science-and-programming-using-python
Algorithms: https://www.coursera.org/specializations/algorithms
Data structure and Algorithms: https://www.coursera.org/specializations/data-structures-algorithms


Web Application Development

Web Applications(PHP): https://www.coursera.org/specializations/web-applications
Web Design(HTML5, CSS3): https://www.coursera.org/specializations/web-design
Progressive Web Apps: https://developers.google.com/web/progressive-web-apps/


Software Engineering

Software Development Lifecycle: https://www.coursera.org/specializations/software-development-lifecycle
Software Design and Architecure: https://www.coursera.org/specializations/software-design-architecture
Secure Software Design: https://www.coursera.org/specializations/secure-software-design
Agile: https://www.coursera.org/specializations/agile-development
Git: https://www.coursera.org/learn/git-distributed-development
Open source Software development: https://www.coursera.org/specializations/oss-development-linux-git


Others

Learning How to Learn: https://www.coursera.org/learn/learning-how-to-learn
Conversatinal Design: https://designguidelines.withgoogle.com/conversation/conversation-design/welcome.html
AWS: https://www.coursera.org/learn/aws-fundamentals-going-cloud-native
Requirements Engineering: https://www.coursera.org/specializations/requirements-engineering-secure-software

In addition to this, there are very good podcast I have list here that every software engineer should listen to.

Mental Models

Decision making is one of the most difficult task one face in the life. And almost every day we have to make one or other decisions, some simple, some complex. 
Many problems in world, there are few ready made templated solutions that we can apply to solve these problems. For example, In software development, we have Design Patterns, which is a "reusable solution to a commonly ocurring problem within a given context in software design" . 
Mental models are similar concepts when it comes to decision makings. Actually it is more than that. You can apply mental models not just in decision making, but every aspect in life, to understand the world, to reason about how and why certain events happen the way they happened. 
Mental models are general thinking principles which can help to think in a structured manner. By stream lining out thoughts while making decisions, we are less prone to miss those information, that would help us in better decision making. Same way, we can make better use of the available information by applying the mental models.
You can learn more about mental models and few great mental models from the book Great Mental Model - Volume 1 and Great Mental Model - Volume 2 by Shane Parrish.

    

Continuous Integration and Delivery pipeline using Bitbucket, AWS CodeBuild, AWS CodePipline and AWS CodeDeploy - Part 3

This is the third article in the series where I explain how to setup Continuous Integration and Delivery pipeline using Bitbucket, AWS CodeBuild, AWS CodePipline and AWS CodeDeploy. You can read previous two articles here and here.

According to Amazon Web Services website:
AWS CodePipeline is a fully managed continuous delivery service that helps you automate your release pipelines for fast and reliable application and infrastructure updates. CodePipeline automates the build, test, and deploy phases of your release process every time there is a code change, based on the release model you define.
So now, let's see how we can set up AWS CodePipeline.

Once you login to you AWS account, go to AWS CodePipeLine and click on "Create pipeline".
Here, provide the name of the pipleline and select "New Service Role" option.

 Choose all default settings under Advanced Settings and click "Next".

On the next step, select source provider, from where you have stored the input artifacts. Here I have selected S3 as source provider, because that is where I am storing output of the codebuild, which I created in the first article.


Click "Next" to go to the next step which is to add a build step. We will skip this step as we have already build our artifacts using code build. But you can add this step here if your artifacts are not built yet. Currently AWS supports AWS CodeCommit and Jenkins as its build providers.

After skipping the build stage, you will get to the "Deploy" stage where you will need to select deployment provider - which essentially means which tool you want to use to deploy your application. Here AWS CodePipeline gives us lot of flexibility as we can select one of the many deployment tools such as CodeDeploy, CloudFormation, Elastic BeanStalk, ECS, Amazon S3 etc. Here we will select AWS CodeDeploy as we have already created a deployment application and deployment group as mentioned in the second part of this series.

Click "Next" and review your changes and click on "Create Pipeline" button.

Your continuous delivery pipeline is ready and it will start automatically. If any artifact is already available in the S3 bucket which we have selected as source provider, then it will get deployed automatically.

One thing to note here is, in CodePipeline so far we have created only two stage: source and deploy. But you can create as many stages as possible, such as unittest stage, integration test state, staging test etc. This way you can create a full fledge continuous integration, continouos delivery as well as continuous deployment pipeline by using AWS CodePipeline.