## Every Thing About Development

## 1. Web Development 👨🏻‍💻

Web development is the work involved in developing a website for the Internet or an intranet. Web development can range from developing a simple single static page of plain text to complex web applications, electronic businesses, and social network services. It means develop and manage a particular website in efficient way of a organisation.


![top-20-programming-languages-used-for-web-development.jpg](https://cdn.hashnode.com/res/hashnode/image/upload/v1657249283822/XZQaNbWsj.jpg align="left")

### 1.1 Who are web developers and what they actually do!

<iframe src="https://giphy.com/embed/PvvSfSDFoAL5e" width="480" height="360" frameBorder="0" class="giphy-embed" allowFullScreen></iframe><p><a href="https://giphy.com/gifs/PvvSfSDFoAL5e"></a></p>

Web developers create and maintain websites. They are also responsible for the site's technical aspects, such as its performance and capacity, which are measures of a website's speed and how much traffic the site can handle. In addition, web developers may create content for the site, with the help of different tool and programming languages.

![FPL0NMsakAYUyg5.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1657249034410/r4Z5druvo.png align="left")


### 1.2 Some important web development tools

**Frontend development tools **

- **Sublime Text:** one that features a well-designed, super efficient, and ultra speedy user interface. There are several that do this well, but arguably the best (and most popular) is Sublime Text.

- **Chrome Developer Tools: ** It allow developers access into the internals of their web application. On top of this, a palette of network tools can help optimize your loading flows, while a timeline gives you a deeper understanding of what the browser is doing at any given moment.

- **jQuery:**  jQuery allowed greater scope for creating animations, adding plug-ins, or even just navigating documents.

- **GitHub: ** The repository hosting service boasts a rich open-source development community (making collaboration between teams as easy as pie), as well as providing several other components such as bug tracking, feature requests, task management, and wikis for every project.

- **CodePen:** CodePen is an incredibly useful tool for those building or overhauling their web developer portfolio.

- **Angular.js:** AngularJS lets you extend your application’s HTML syntax, resulting in a more expressive, readable, and quick to develop environment that could otherwise not have been built with HTML alone.

**Backend development tools **

 - **PHP:** PHP  an acronym for Hypertext Preprocessor, is a server-side scripting language and is one of the most widely used programming languages for backend web development. 

 - **Python:** It is a high-level, general-purpose programming language that supports multiple programming paradigms such as Object-Oriented, Procedural, and Functional. Instagram, Spotify, Google, etc. are some of the popular platforms that are using Python in their tech stacks.

 - **JavaScript:** It is actually one of the fundamental units of web development alongside HTML and CSS.

 - **Java:** Java syntax is similar to C/C++. But Java does not provide low-level programming functionalities like pointers. Also, Java codes are always written in the form of classes and objects.

 - **Go:** Golang is a procedural and statically typed programming language having the syntax similar to C programming language. Sometimes it is termed as Go Programming Language. It provides a rich standard library, garbage collection, and dynamic-typing capability.


### 1.3 Web development roles

There are three major roles in web development. Each type focuses on different areas of web development but we all have one thing in common. And that's coding. The first step you would take in becoming a web developer - no matter the role - is to learn how to code. You can start learning the basics of hypertext markup language HTML, and the Cascading Styling Sheet CSS. Then, start doing a lot of practice with it.

### 1.4 Frontend development 

![0001.PNG](https://cdn.hashnode.com/res/hashnode/image/upload/v1657246585600/i5IwVxl6B.PNG align="left")

Front-end web development, also known as client-side development is the practice of producing HTML, CSS and JavaScript for a website or Web Application so that a user can see and interact with them directly. The challenge associated with front end development is that the tools and techniques used to create the front end of a website change constantly and so the developer needs to constantly be aware of how the field is developing.

### 1.5 Backend development


![0002.PNG](https://cdn.hashnode.com/res/hashnode/image/upload/v1657246608470/5o4sT1kCr.PNG align="left")

Backend Development is also known as server-side development. It is everything that the users don't see and contains behind-the-scenes activities that occur when performing any action on a website. It focuses primarily on databases, backend logic, APIs, and Servers.

### 1.6 Full-stack development

In case of full stack development it is necessary to maintain both frondend and backend. 
A Full stack web developers have the ability to design complete web applications and websites. They work on the frontend, backend, database and debugging of web applications or websites.The front end is responsible for the visual look and feel of the website, while back end is responsible for the behind the scenes logic and infrastructure of the site.


## 2. Android Development

Android is an operating system and programming platform developed by Google for mobile phones and other mobile devices, such as tablets. It can run on many different devices from many different manufacturers. Android includes a software development kit (SDK) that helps you write original code and assemble software modules to create apps for Android users. Android also provides a marketplace to distribute apps. All together, Android represents an ecosystem for mobile apps.

### 2.1 Who are android developers and what they actually do!


![coffee-3080831_1920.jpg](https://cdn.hashnode.com/res/hashnode/image/upload/v1657254774886/qXtniXBZm.jpg align="left")

An Android developer is a software developer that specializes in creating applications for Android-based devices. Android, of course, is a mobile operating system (OS) developed by Google. It is based on a modified version of the Linux OS and other open-source software. Android was designed for use on touchscreen mobile devices such as smartphones and tablets. It is the direct competitor of Apple’s iOS, Windows Phone OS, and BlackBerry OS, among others.


![ezgif.com-gif-maker.gif](https://cdn.hashnode.com/res/hashnode/image/upload/v1658583961749/afQiPEutM.gif align="left")

### 2.2 Some important android development tools


![android-developer-tools.jpg](https://cdn.hashnode.com/res/hashnode/image/upload/v1657255100388/rnextAKok.jpg align="left")



- **Android SDK :**The Android Software Development Kit (SDK) provides you with the API libraries and developer tools necessary to build, test, and debug apps for the Android platform. It is one of the most popular SDKs used for Android.

- **Native Development Kit (NDK):** The NDK is a toolset that allows Android developers to implement parts of their app using native-code languages such as C and C++. NDK can help developers as they can reuse existing code libraries written in these languages. 

- **Titanium Mobile SDK:** The Titanium SDK provides community developers with an unmatched ability to create quality native, mobile, web, or rich hybrid applications to all platforms from a single code base using JavaScript.

- **Hypernext Android Creator:** HyperNext Android Creator (HAC) is an easy-to-use software creation system that allows almost anyone to build their Android apps. Mobile apps developed on HAC enjoy good support on a wide range of devices.

- **ADOBE AIR:** It enables developers to package the same code into native apps for iPhone, iPad, Kindle Fire, Nook Tablet, and other Android™ devices, reaching the mobile app stores for over 500 million devices. Running on Action Script, HTML, CSS, AIR allows users to develop cross-platform mobile apps saving time and minimizing the development cost.


## 3. Application Development


![services-details1.jpg](https://cdn.hashnode.com/res/hashnode/image/upload/v1658581067083/oLvQ3LYji.jpg align="left")

Application development is the process of creating a computer program or a set of programs to perform the different tasks that a business requires. From calculating monthly expenses to scheduling sales reports, applications help businesses automate processes and increase efficiency. Every app-building process follows the same steps: gathering requirements, designing prototypes, testing, implementation, and integration.
In other words application development is the process of designing, building, and implementing software applications. It can be done by massive organizations with large teams working on projects, or by a single freelance developer. Application development defines the process of how the application is made, and generally follows a standard methodology.

### 3.1 Who are application developers and what they actually do

An application developer is a professional who designs, creates, deploys and updates programs for a particular device, the web or a specific operating system. Developers typically specialize in one area of development.


### 3.2 Some important application development tools



![images.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1657506303080/xiO8GAXE2.png align="left")


- Azure
- Jira
- GitHub
- IntelliJ IDEA


- **Microsoft Azure:** Microsoft Azure is a cloud computing service that is used for designing, deploying, testing and managing web applications or hybrid cloud applications through Microsoft’s global network of data centers.

- **Jira: ** Jira is the most popular software development tool that is used by agile teams for planning, tracking and releasing the software.

- **GitHub: ** GitHub is a powerful collaboration tool and development platform for code review and code management. With this GitHub, the users can build applications and software, manage the projects, host the code, review the code etc.

- **IntelliJ IDEA:** IntelliJ IDEA is an integrated development environment written in Java for developing computer software written in Java, Kotlin, Groovy, and other JAR based languages. It is developed by JetBrains, and is available as an Apache 2 Licensed community edition



## 4. What does a development life cycle looks like!


![development-lifecycle.gif](https://cdn.hashnode.com/res/hashnode/image/upload/v1657507502307/XS5XruS8u.gif align="left")

SDLC allows developers to analyze the requirements. It helps in reducing unnecessary costs during development.The software development life cycle, also referred to as the application development life-cycle, is a process for planning, creating, testing, and deploying an information system. It is a structural way that we can maintain a software application in a planned manner. There are seven phases of SDLC include planning, analysis, design, development, testing, implementation, and maintenance.


## 5. What is open source software development


![header.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1657508083145/txuCVJHo2.png align="left")

Open-source software development is the process by which open-source software, or similar software whose source code is publicly available, is developed by an open-source software project. These are software products available with its source code under an open-source organization.

Some of the best resource i mention below just check it out


https://youtu.be/msyGybzCKRs   🚩

https://youtu.be/AODHPiOvF1U   🚩

https://youtu.be/GrSPJOuG54w  🚩

https://www.cncf.io/ 🚩


Feel free to reach out me 👀

[Twitter](https://twitter.com/ADITYA90546170) 🖱

[LinkedIn](https://www.linkedin.com/in/aditya-das-7b2276202) 🖱

[Github](https://github.com/ADITYADAS1999) 🖱




