<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Sanket Jagdale on Medium]]></title>
        <description><![CDATA[Stories by Sanket Jagdale on Medium]]></description>
        <link>https://medium.com/@devgrammer?source=rss-29c32629ec39------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*rUNVJ9xx5Y8_w7eB</url>
            <title>Stories by Sanket Jagdale on Medium</title>
            <link>https://medium.com/@devgrammer?source=rss-29c32629ec39------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Mon, 25 May 2026 02:52:42 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@devgrammer/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[PostgreSQL(neondb) with Node.js : Beginner’s Guide]]></title>
            <link>https://devgrammer.medium.com/postgresql-neondb-with-node-js-beginners-guide-31f669e4a613?source=rss-29c32629ec39------2</link>
            <guid isPermaLink="false">https://medium.com/p/31f669e4a613</guid>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[beginners-guide]]></category>
            <category><![CDATA[crud]]></category>
            <category><![CDATA[node]]></category>
            <category><![CDATA[postgres]]></category>
            <dc:creator><![CDATA[Sanket Jagdale]]></dc:creator>
            <pubDate>Sun, 11 Feb 2024 11:12:34 GMT</pubDate>
            <atom:updated>2024-02-11T11:12:34.475Z</atom:updated>
            <content:encoded><![CDATA[<h3>PostgreSQL(neondb) with Node.js : Beginner’s Guide</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*gL9aCLS_47VrQksR55__Uw.jpeg" /><figcaption>Cover Image</figcaption></figure><p>In the world of web development, databases play a pivotal role in storing and managing data efficiently. Among the myriad of choices available, PostgreSQL stands out as a <strong>powerful, open-source relational database system</strong>. When combined with the flexibility and versatility of Node.js, a robust and scalable backend solution can be crafted. In this guide, we’ll explore the process of connecting Neondb with a Node.js application, offering a clear path for developers seeking an efficient data storage solution.</p><h3>Why PostgreSQL?</h3><ol><li><strong>Open Source and Community-Driven:</strong></li></ol><ul><li>PostgreSQL is an open-source database with a rich history and a vibrant community. Its community-driven development ensures continuous improvement, security updates, and feature enhancements.</li></ul><p><strong>2. ACID Compliance:</strong></p><ul><li>PostgreSQL adheres to the ACID (Atomicity, Consistency, Isolation, Durability) properties, ensuring reliability and data integrity in even the most complex transactions.</li></ul><p><strong>3. Extensible and Customizable:</strong></p><ul><li>The extensibility of PostgreSQL allows users to define their data types, operators, functions, and aggregates, offering a level of customization that’s crucial for diverse application requirements.</li></ul><p><strong>4. Scalability and Performance:</strong></p><ul><li>Whether you’re dealing with small-scale projects or enterprise-level applications, PostgreSQL’s architecture is designed for scalability. Its performance capabilities shine, particularly in scenarios with a high volume of concurrent transactions.</li></ul><h4>What is NeonDB ?</h4><p>NeonDB, also known as Neon, is a serverless, open-source alternative to traditional database-as-a-service (DaaS) offerings like AWS Postgres. It utilizes a unique architecture that separates compute and storage, granting it several advantages over its competitors.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*69W2D97XjmEcJht18CsIxA.png" /><figcaption>NeonDB</figcaption></figure><h4>Why neon ?</h4><ul><li><strong>Serverless:</strong> NeonDB eliminates the need for you to manage and provision database servers. This allows you to focus on your application development and saves you time and resources.</li><li><strong>Scalable:</strong> NeonDB can automatically scale up or down based on your needs, ensuring that you always have the right amount of resources available.</li><li><strong>Fault-tolerant:</strong> NeonDB is designed to be highly fault-tolerant, with automatic failover and data replication.</li><li><strong>Branchable:</strong> NeonDB supports database branching, which allows you to create multiple versions of your database for development, testing, and production purposes.</li><li><strong>Cost-effective:</strong> NeonDB is priced based on usage, so you only pay for the resources you use.</li></ul><p>Lets start with the step by step guide :</p><ol><li>Make account on <a href="https://neon.tech/">https://neon.tech/</a></li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ivtRJ3JnJsCJqMPt-2855A.png" /></figure><p>2. Create a free project, create a database !</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2NMabg_QzyvdSI3hbytplA.png" /></figure><p>3. Create a new Database, name it whatever you want! (i am naming it as ‘test’)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OzgK0sW9EUaFCsbVEkmmgQ.png" /></figure><p>4. copy the connection string for the same</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/813/1*tJ11-IIYBEIKnAvW2M-5gA.png" /></figure><p>5. Using a library that let’s you connect and put data in it</p><p>pg is a Node.js library that you can use in your backend app to store data in the Postgres DB (similar to mongoose). We will be installing this eventually in our app.</p><p>6. Connecting db with NodeJS</p><p>6.1 : Initialize empty NodeJS app</p><pre>npm init -y</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iAAwIF9KY3Ex8L4Pjce2jA.png" /></figure><p>6.2 : Install pg</p><p>pg is a Node.js library that you can use in your backend app to store data in the Postgres DB (similar to mongoose). We will be installing this eventually in our app.</p><pre>npm install pg</pre><p>6.3 : Connect Database client : ( paste your <em>connectionString </em>)</p><pre>import { Client } from &quot;pg&quot;;<br><br>const client = new Client({<br>  connectionString:&quot;postgresql://sanketsj00900:************@ep-holy-forest-a51n3thp.us-east-2.aws.neon.tech/test?sslmode=require&quot;<br>})<br><br>client.connect();</pre><p>7. Creating Table by defining schema</p><p><strong>Tables in SQL :</strong></p><p>Tables are database objects that contain all the data in a database. In tables, data is logically organized in a row-and-column format similar to a spreadsheet. Each row represents a unique record, and each column represents a field in the record.</p><p>Please refer below article to know about different attributes and keys in detail :</p><p><a href="https://www.w3schools.com/sql/sql_create_table.asp">SQL CREATE TABLE Statement</a></p><h3>Using Nodejs to manipulate PostgreSQL Data:</h3><h4>CRUD Operations :</h4><p>C — Create Table, Database</p><p>R — Read data from database</p><p>U — Update data from database</p><p>D — Delete data from database</p><ol><li>Create Table</li></ol><pre>const { Client } = require(&#39;pg&#39;)<br> <br>const client = new Client({<br>  connectionString:&quot;postgresql://sanketsj00900:************@ep-holy-forest-a51n3thp.us-east-2.aws.neon.tech/test?sslmode=require&quot;;<br>})<br><br>// Function to create a users table in database.<br>async function createUsersTable() {<br>    await client.connect()<br>    const result = await client.query(`<br>        CREATE TABLE users (<br>            id SERIAL PRIMARY KEY,<br>            username VARCHAR(50) UNIQUE NOT NULL,<br>            email VARCHAR(255) UNIQUE NOT NULL,<br>            password VARCHAR(255) NOT NULL,<br>            created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP<br>        );<br>    `)<br>    console.log(result)<br>}<br><br>createUsersTable();</pre><p>Output :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7x7aDXAFcPs1UYR4S79-wg.png" /></figure><p>You can easily see tables from test -&gt; tables, and yes users table is created succesfully!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*Azr4qsh08YAm6buc0d7IIw.png" /></figure><p>2. Inserting data into the table</p><pre>async function insertData() {<br>  try {<br>    await client.connect(); // Ensure client connection is established<br>    const insertQuery =<br>      &quot;INSERT INTO users (username, email, password) VALUES (&#39;username1&#39;, &#39;user1@example.com&#39;, &#39;user1_password&#39;);&quot;;<br>    const res = await client.query(insertQuery);<br>    console.log(&quot;Insertion success:&quot;, res); // Output insertion result<br>  } catch (err) {<br>    console.error(&quot;Error during the insertion:&quot;, err);<br>  }<br>}</pre><p>Output :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/704/1*CWGl42Cdx7YItfq3Bo6LHg.png" /></figure><p>Entry is inserted succesfully !</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JliIwNMjMasVoaAaRHAdbA.png" /></figure><p>But, there is one issue in this approach</p><blockquote>This is an insecure way to store data in your tables. When you expose this functionality eventually via HTTP, someone can do an SQL INJECTION to get access to your data/delete your data.</blockquote><p>More secured way : don’t put user provided fields (ie. username, password, eamil) in the SQL string</p><p>Solution :</p><pre>const insertQuery = &#39;INSERT INTO example_table(column1, column2) VALUES($1, $2)&#39;;<br>const res = await client.query(insertQuery, [column1Value, column2Value]);</pre><p>More secured way of interting data :</p><pre>async function insertData(username, email, password) {<br>  try {<br>    await client.connect();<br>    // Use parameterized query to prevent SQL injection<br>    const insertQuery =<br>      &quot;INSERT INTO users (username, email, password) VALUES ($1, $2, $3)&quot;;<br>    const values = [username, email, password];<br>    const res = await client.query(insertQuery, values);<br>    console.log(&quot;Insertion success:&quot;, res); // Output insertion result<br>  } catch (err) {<br>    console.error(&quot;Error during the insertion:&quot;, err);<br>  }<br>}<br><br>// createUsersTable();<br>insertData(&quot;user2&quot;, &quot;user2@gmail.com&quot;, &quot;user2_pass&quot;);</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tmHEbg8jNiU0-1K1O_DfMA.png" /></figure><p>3. reading data from database</p><pre>async function getData() {<br>  await client.connect();<br>  const res = await client.query(`SELECT * FROM users`);<br>  console.log(res);<br>  return res;<br>}</pre><p>Output :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/605/1*rcnREVMUsbQy1E_9lPWoCA.png" /></figure><p>4. Updating data from database</p><pre>async function updatePass(username, newPass) {<br>  await client.connect();<br>  const updateQuery = `UPDATE users SET password = $2 WHERE username = $1`;<br>  const values = [username, newPass];<br>  const res = await client.query(updateQuery, values);<br>  console.log(res);<br>  return res;<br>}<br><br>updatePass(&quot;user2&quot;, &quot;updates2_pass&quot;);</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*gWTuN5sk2aXkJLSWKIOhKA.png" /></figure><p>4. Deleting data from database</p><pre>async function deleteUser(username) {<br>  await client.connect();<br>  const deleteQuery = `DELETE FROM users WHERE username = $1`;<br>  const res = await client.query(deleteQuery, [username]);<br>  console.log(res);<br>  return res;<br>}<br><br>deleteUser(&quot;user2&quot;);</pre><p>Output :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/672/1*tpdPeegVi6toKXIN8nHN9w.png" /></figure><p>Updated Database :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*f3OpVNlHN8-M_AAFnosgkA.png" /></figure><p>So, this was the beginner’s guide about connecting the database, and manipulating data by doing CRUD operations !</p><p>If you like this particular blog, please follow <a href="https://medium.com/u/29c32629ec39">Sanket Jagdale</a>! and stay tuned for more such amazing blogs !</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=31f669e4a613" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Hashing and Salting passwords in Nodejs using bcrpyt !]]></title>
            <link>https://devgrammer.medium.com/hashing-and-salting-passwords-in-nodejs-using-bcrpyt-369ed308f722?source=rss-29c32629ec39------2</link>
            <guid isPermaLink="false">https://medium.com/p/369ed308f722</guid>
            <category><![CDATA[bcrypt]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[webdev]]></category>
            <category><![CDATA[hashing]]></category>
            <dc:creator><![CDATA[Sanket Jagdale]]></dc:creator>
            <pubDate>Tue, 30 Jan 2024 10:07:03 GMT</pubDate>
            <atom:updated>2024-01-30T10:07:03.805Z</atom:updated>
            <content:encoded><![CDATA[<h3>Hashing and Salting passwords in Nodejs using bcrpyt !</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KPWsa0qLc4ncYuYer2xd9A.jpeg" /><figcaption>Hashing and Salting passwords</figcaption></figure><p>Hashing and salting passwords is important for security reasons. When users create accounts on websites, their passwords should be stored securely to prevent unauthorized access in case the database is compromised. Here’s why hashing and salting are crucial:</p><ol><li><strong>Password Hashing:</strong></li></ol><ul><li>Security: Hashing is a one-way process, making it difficult for attackers to reverse-engineer the original password from the hash.</li><li>Consistency: Hashing ensures that the stored password is consistently represented in a fixed-size hash format, regardless of the length or complexity of the original password.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/0*USInF4lMQtQsmAox.jpg" /></figure><p><strong>2. Salting:</strong></p><ul><li>Uniqueness: Salting involves adding a random value (salt) to each password before hashing. This ensures that even if two users have the same password, their hashes will be different due to the unique salt.</li><li>Defense Against Attacks: Salting helps defend against precomputed attacks, rainbow table attacks, and other types of attacks that attempt to guess passwords by using precomputed hashes.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*hdFNLJljgFgF5ObN.png" /></figure><p>Here’s how you can hash and salt passwords in Node.js with Express using the bcrypt library:</p><ol><li>Install bcrypt livrary</li></ol><p>npm install bcrypt</p><p>2. File structure</p><p>-backend<br>-index.js <br>- db.js <br>— routes<br> — — user.js</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/321/1*QXsZNDPsDOEPH_c3m63ulg.png" /><figcaption>File system</figcaption></figure><p>3. Connect express and mongoose and create userSchema</p><pre>const mongoose = require(&quot;mongoose&quot;);<br>const bcrypt = require(&quot;bcrypt&quot;);<br>const MONGO_URL = process.env.MONGO_URL;<br>mongoose.connect(MONGO_URL);<br><br><br>const userSchema = new mongoose.Schema({<br>  username: {<br>    type: String,<br>    required: true,<br>    unique: true,<br>    trim: true,<br>    lowercase: true,<br>    minLength: 3,<br>    maxLength: 30,<br>  },<br>  password: {<br>    type: String,<br>    required: true,<br>    minLength: 6,<br>  },<br>  firstName: {<br>    type: String,<br>    required: true,<br>    trim: true,<br>    maxLength: 50,<br>  },<br>  lastName: {<br>    type: String,<br>    required: true,<br>    trim: true,<br>    maxLength: 50,<br>  },<br>});<br><br><br>const User = mongoose.model(&quot;User&quot;, userSchema);<br><br>module.exports = {<br>  User,<br>};</pre><p>4. In db.js , Write createHash and validatePassword for generating hash from password and validate it.</p><pre><br>const userSchema = new mongoose.Schema({<br>  username: {<br>    type: String,<br>    required: true,<br>    unique: true,<br>    trim: true,<br>    lowercase: true,<br>    minLength: 3,<br>    maxLength: 30,<br>  },<br>  password: {<br>    type: String,<br>    required: true,<br>    minLength: 6,<br>  },<br>  firstName: {<br>    type: String,<br>    required: true,<br>    trim: true,<br>    maxLength: 50,<br>  },<br>  lastName: {<br>    type: String,<br>    required: true,<br>    trim: true,<br>    maxLength: 50,<br>  },<br>});<br><br><br>// -------------------------- bcrypt methods ---------------------------- // <br><br>//* Method to generate a hash from plain text<br><br>userSchema.methods.createHash = async function (plainTextPassword) {<br><br>  // Hashing user&#39;s salt and password with 10 iterations,<br>  const saltRounds = 10;<br><br>  // create salt and hash<br>  return await bcrypt.hash(plainTextPassword, saltRounds);<br>};<br><br>//* Validating the candidate password with stored hash and hash function<br><br>userSchema.methods.validatePassword = async function (candidatePassword) {<br>  return await bcrypt.compare(candidatePassword, this.password);<br>};<br><br>// -------------------------- bcrypt methods ---------------------------- //<br><br>const User = mongoose.model(&quot;User&quot;, userSchema);<br><br>module.exports = {<br>  User,<br>};</pre><p>5. In routes/user.js define signin and signup routes</p><pre>const express = require(&quot;express&quot;);<br>const zod = require(&quot;zod&quot;);<br>const { User } = require(&quot;../db.js&quot;);<br>const jwt = require(&quot;jsonwebtoken&quot;);<br><br>const JWT_SECRET = process.env.JWT_SECRET;<br><br>const router = express.Router();<br><br>const signupBody = zod.object({<br>  username: zod.string().email(),<br>  firstName: zod.string(),<br>  lastName: zod.string(),<br>  password: zod.string(),<br>});<br><br>//* Route : .../api/v1/user/signup<br>router.post(&quot;/signup&quot;, async (req, res) =&gt; {<br>  try {<br>    const { success } = signupBody.safeParse(req.body);<br><br>    if (!success) {<br>      return res.status(411).json({<br>        message: &quot;Invalid Inputs ! &quot;,<br>      });<br>    }<br><br>    const existingUser = await User.findOne({<br>      username: req.body.username,<br>    });<br><br>    if (existingUser) {<br>      return res.status(411).json({<br>        message: &quot;User already exists !&quot;,<br>      });<br>    }<br><br>    const newUser = new User({<br>      username: req.body.username,<br>      password: req.body.password,<br>      firstName: req.body.firstName,<br>      lastName: req.body.lastName,<br>    });<br><br>    var hashedPassword = await newUser.createHash(newUser.password);<br>    newUser.password = hashedPassword;<br><br>    await newUser.save();<br><br>    const userId = newUser._id;<br><br>    const token = jwt.sign(<br>      {<br>        userId,<br>      },<br>      JWT_SECRET<br>    );<br><br>    res.json({<br>      message: &quot;User created successfully&quot;,<br>      token: token,<br>    });<br>  } catch (error) {<br>    console.error(error);<br>    res.status(500).json({<br>      message: &quot;Internal Server Error&quot;,<br>    });<br>  }<br>});<br><br>//?----------------------------------------------?//<br><br>const signinBody = zod.object({<br>  username: zod.string().email(),<br>  password: zod.string(),<br>});<br><br>//* Route : .../api/v1/user/signin<br><br>router.post(&quot;/signin&quot;, async (req, res) =&gt; {<br>  const { success } = signinBody.safeParse(req.body);<br><br>  if (!success) {<br>    return res.status(411).json({<br>      message: &quot;Username Already taken / Invalid Inputs !&quot;,<br>    });<br>  }<br><br>  const user = await User.findOne({<br>    username: req.body.username,<br>  });<br><br>  if (user) {<br>    if (await user.validatePassword(req.body.password)) {<br>      const token = jwt.sign(<br>        {<br>          userId: user._id,<br>        },<br>        JWT_SECRET<br>      );<br><br>      res.json({<br>        token: token,<br>      });<br>      return;<br>    } else {<br>      return res.status(400).json({<br>        message: &quot;Incorrect Password&quot;,<br>      });<br>    }<br>  }<br>});<br><br>module.exports = router;</pre><p>Once we write the code, we can test it using Postman or VS code extension called thunderclient . Lets test this out !</p><p>Start the server using npx nodemon index.js</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/487/1*Iux3GugswPZj8YGi6bzuqg.png" /><figcaption>server started</figcaption></figure><p>Lets first hit signnup route !</p><p>Lets give some inputs in body !</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/765/1*xPNCzuolJezfD_TainR-Yw.png" /></figure><p>Here you can see the new user and respective JWT token is created. Also the new entry is added into the database.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IsD1mvuFimyHMdewRzPPGQ.png" /><figcaption>DB entry</figcaption></figure><p>The thing to notie here is, the stored password is hashed !</p><p>Now lets test out the signin route !</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/770/1*O-9NEKPf-efvOADQ0TrPcA.png" /></figure><p>So this is how you can easily hash your passwords using bcrypt !</p><p>If you liked this blog, Do follow <a href="https://medium.com/u/29c32629ec39">Sanket Jagdale</a> !</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=369ed308f722" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Evolution of Frontend Development]]></title>
            <link>https://devgrammer.medium.com/evolution-of-frontend-development-305213a54ad6?source=rss-29c32629ec39------2</link>
            <guid isPermaLink="false">https://medium.com/p/305213a54ad6</guid>
            <category><![CDATA[react]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[responsive-design]]></category>
            <category><![CDATA[web-development]]></category>
            <dc:creator><![CDATA[Sanket Jagdale]]></dc:creator>
            <pubDate>Wed, 03 May 2023 18:36:23 GMT</pubDate>
            <atom:updated>2023-05-03T19:17:07.433Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9WguzM0i8AkUWfj0QdH54Q.jpeg" /><figcaption>Title Image</figcaption></figure><p><strong>What exactly do we mean when we say “Frontend”?</strong></p><p>Frontend development, also known as client-side development, is the practice of creating the visual and interactive components of a website or application that users see and interact with.</p><p>In the web development process, front-end development comes after the design stage and before the back-end development stage. The frontend developer takes the design files (typically created in tools like Adobe Photoshop or Sketch) into functional, interactive web pages using programming languages such as HTML, CSS, and JavaScript.</p><p>Frontend developers also use various tools and frameworks to streamline their workflow and make the development process more efficient. Some popular front-end frameworks include React, Angular, and Vue.js.</p><p><strong>Importance of Frontend :</strong></p><ol><li><strong>User experience:</strong> The frontend is the user’s first point of contact with a website or application, and it determines how the user interacts with the site. A well-designed frontend that is easy to use and aesthetically pleasing can greatly enhance the user experience and keep users engaged.</li><li><strong>Responsiveness: </strong>With the increasing use of mobile devices, it is essential that websites and applications are designed to be responsive to different screen sizes. Frontend development plays a crucial role in ensuring that websites and applications are optimized for mobile devices and provide a seamless user experience across all devices.</li><li><strong>Accessibility:</strong> Frontend development can also improve the accessibility of websites and applications for users with disabilities. Using accessible design practices, such as semantic HTML and ARIA (Accessible Rich Internet Applications) attributes, frontend developers can ensure that their websites and applications are usable by a wider audience.</li><li><strong>SEO:</strong> A well-designed frontend can also improve the search engine optimization (SEO) of a website or application. By using proper HTML tags, structured data, and semantic markup, frontend developers can help search engines better understand the website&#39;s content and improve its visibility in search engine results pages.</li><li><strong>Performance:</strong> The frontend can also affect the performance of a website or application. By optimizing the code, minimizing the number of requests, and using efficient design practices, frontend developers can improve the performance of the website and provide a faster and smoother user experience.</li><li><strong>Brand identity:</strong> The frontend design is also important for establishing and maintaining a brand’s identity. A consistent design language and visual style across a website or application can help to reinforce a brand’s identity and make it more memorable to users.</li></ol><p><strong>Timeline of the evolution</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*ftOrezqeh5B48Lv5txLXOQ.jpeg" /><figcaption><strong>Timeline of the evolution</strong></figcaption></figure><p>This timeline shows how the initial technologies of HTML, CSS, and the DOM were followed by the addition of JavaScript for interactivity and AJAX for faster loading. Then came the rise of responsive design and CSS frameworks, followed by the shift towards component-based architecture and the emergence of newer CSS technologies like grid/flexbox and CSS variables. More recent additions to the frontend ecosystem include Web Components, PWA, and WebGPU.</p><p>Frontend development has come a long way since the early days of the World Wide Web. From basic HTML and CSS to complex component-based frameworks, the evolution of frontend development has been driven by a desire to create more engaging, interactive, and user-friendly web applications. Here’s a closer look at the different stages of frontend development:</p><p><strong>A. 1990s: HTML and CSS</strong></p><p>In the early days of the web, frontend development consisted primarily of creating simple static pages using HTML and CSS. HTML provided the structure of the page, while CSS was used for styling and layout. These basic tools were sufficient for creating basic websites, but they were limited in terms of interactivity and dynamic content.</p><p><strong>B. 2000s: JavaScript</strong></p><p>With the advent of JavaScript in the early 2000s, frontend development took a major leap forward. JavaScript made it possible to create more interactive and dynamic web applications, with features like animations, pop-ups, and form validation. JavaScript frameworks like jQuery made it easier to write complex code, and libraries like React and Vue allowed developers to build complex web applications with ease.</p><p><strong>C. 2010s: Responsive Design</strong></p><p>The rise of mobile devices in the 2010s led to a renewed focus on responsive design. Responsive design is a design approach that ensures that web applications look and function well on any device, regardless of its screen size or orientation. This was accomplished through the use of fluid layouts, flexible images, and CSS media queries.</p><p><strong>D. 2020s: Component-based Frameworks</strong></p><p>In recent years, frontend development has moved towards component-based frameworks. These frameworks provide a modular approach to building web applications, with reusable components that can be combined to create complex interfaces. Examples of component-based frameworks include Angular, React, and Vue.</p><p><strong>The Future of Frontend:</strong></p><p>The future of frontend web development is expected to be driven by a combination of emerging technologies, user demands, and developer efficiency. It will continue to evolve rapidly, providing exciting opportunities and challenges for frontend developers to create innovative and user-friendly web applications. Staying updated with the latest trends and technologies and continuously improving skills will be crucial for frontend developers to thrive in the ever-evolving web development landscape.</p><p><strong>WebAssembly</strong></p><p>WebAssembly (often abbreviated as wasm) is a binary instruction format for a stack-based virtual machine. It is designed as a low-level virtual machine that runs code at near-native speed, making it a powerful technology for frontend web development. Here are some potential future developments for WebAssembly in frontend web development:</p><p>1. Increased Adoption: WebAssembly has gained significant momentum since its introduction, and it is expected to continue to grow in adoption.</p><p>2. Broader Language Support: Currently, WebAssembly supports several programming languages, including C/C++, Rust, and Go.</p><p><strong>AI and ML</strong></p><p>The intersection of frontend web development with Artificial Intelligence (AI) and Machine Learning (ML) is an exciting area with significant potential for the future. Here are some key areas where AI and ML may impact frontend web development:</p><p>1. Personalized User Experiences: AI and ML technologies can analyze user behavior, preferences, and data to create personalized user experiences on the frontend.</p><p>2. Chatbots and Virtual Assistants: AI-powered chatbots and virtual assistants can be integrated into frontend web applications to provide interactive and dynamic interactions with users.</p><p><strong>Progressive Web Apps (PWAs):</strong></p><p>PWAs are web applications that function like native apps, providing a rich user experience with offline capabilities, push notifications, and seamless updates. PWAs are becoming increasingly popular due to their ability to offer a fast, engaging, and app-like experience on the web, and are likely to play a significant role in the future of frontend web development.</p><p>1. Enhanced Offline Capabilities: PWAs are known for their offline capabilities, allowing users to access content and features even without an internet connection.</p><p>2. Improved Performance: Performance is a critical factor for web applications, including PWAs.</p><p><strong>Challenges and Opportunities</strong></p><p>In today’s digital age, front-end development has become an essential component of building any successful web application or website. Frontend development involves designing and developing the visual elements of a web application or website that users interact with. It is the bridge between the user interface and the backend functionality of the application. However, front-end development comes with its own set of challenges and opportunities.</p><p><strong><em>Challenges:</em></strong></p><p><strong>Limited technology:</strong> In the early days of frontend development, the technology was limited, which made it difficult to create dynamic and responsive web pages. Developers had to work with basic HTML, CSS, and JavaScript, which made it difficult to create complex layouts and interactions.</p><p><strong>Limited tools:</strong> There were very few tools available to developers for testing and debugging, which made it difficult to identify and fix errors in code. Developers had to rely on manual testing, which was time-consuming and error-prone.</p><p><strong>Browser compatibility:</strong> Different browsers had different ways of rendering web pages, which made it challenging to ensure that a website looked and functioned correctly across different browsers. Developers had to create browser-specific hacks and workarounds, which made the codebase more complex.</p><p><strong>Lack of standards:</strong> In the early days, there were no industry standards for web development, which made it difficult to create consistent and reliable web pages. Developers had to rely on best practices and trial-and-error to figure out what worked and what didn’t.</p><p><strong>Performance optimization: </strong>Performance optimization is a critical aspect of frontend development. Slow-loading web applications and websites can lead to poor user experience and lost revenue. Ensuring fast load times requires frontend developers to consider various factors such as file size, caching, and rendering time.</p><p><strong><em>Opportunities:</em></strong></p><p><strong>Innovation:</strong> Early frontend development was a time of innovation, as developers were experimenting with new ways of creating web pages. This led to the creation of new techniques and tools that are still in use today.</p><p><strong>Learning:</strong> With limited technology and tools, developers had to be creative and resourceful in solving problems. This led to a deep understanding of the underlying technologies and a strong foundation in the fundamentals of web development.</p><p><strong>Flexibility:</strong> With no industry standards, developers had the flexibility to create web pages in their own way, which allowed for a lot of creativity and experimentation.</p><p><strong>Impact:</strong> With the internet still in its early days, early frontend developers had the opportunity to create websites and web applications that had a significant impact on people’s lives. This inspired a generation of developers to continue pushing the boundaries of what was possible with web development.</p><p>Overall, early frontend development was a challenging but exciting time for developers. The limitations and challenges of the time pushed developers to be more innovative and creative, which laid the foundation for the modern web development industry.</p><p><strong>Conclusion</strong></p><p>In conclusion, the evolution of frontend development has been a gradual and continuous process, starting from the foundational technologies of HTML, CSS, and the DOM, and progressing towards more advanced and complex technologies like Web Components, PWA, and WebGPU. As technology has advanced, so has the frontend ecosystem, with each new technology building on the foundations of the previous ones. This evolution has led to the creation of more dynamic, responsive, and interactive web applications, which have become an integral part of our daily lives. The frontend development landscape is constantly evolving, and as new technologies continue to emerge, it will be interesting to see how they shape the future of web development.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*mGZ0Mh0Dbp6HiPzXv3F1tw.png" /><figcaption>Frontend Developer Roadmap</figcaption></figure><p><strong>Written By :</strong></p><p><em>Suraj Jadhav</em></p><p><em>Sanket Jagdale</em></p><p><em>Niraj Jangale</em></p><p><em>Ayush Jiwatode</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=305213a54ad6" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Top Free HTML Resources ‍]]></title>
            <link>https://devgrammer.medium.com/top-free-html-resources-ba8b9ff74025?source=rss-29c32629ec39------2</link>
            <guid isPermaLink="false">https://medium.com/p/ba8b9ff74025</guid>
            <category><![CDATA[resources]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[free]]></category>
            <category><![CDATA[html]]></category>
            <category><![CDATA[best]]></category>
            <dc:creator><![CDATA[Sanket Jagdale]]></dc:creator>
            <pubDate>Sun, 16 Apr 2023 07:57:36 GMT</pubDate>
            <atom:updated>2023-04-16T08:07:21.309Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zZJMwDFfwU4h4jxdF_1WmQ.jpeg" /></figure><p>If you want to become a full stack web developer, then your first step should be learning HTML, and if you go on the internet and search for resources of HTML, you will be lost in the ocean of resources. So in this particular blog, I will be sharing some top resources from where you can learn HTML for free and move ahead with your journey of becoming a full-stack web developer.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2FeYp5zQ5GX0PUXM47u1%2Ftwitter%2Fiframe&amp;display_name=Giphy&amp;url=https%3A%2F%2Fmedia.giphy.com%2Fmedia%2FeYp5zQ5GX0PUXM47u1%2Fgiphy.gif&amp;image=https%3A%2F%2Fi.giphy.com%2Fmedia%2FeYp5zQ5GX0PUXM47u1%2Fgiphy.gif&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=giphy" width="435" height="280" frameborder="0" scrolling="no"><a href="https://medium.com/media/aa71d9ed455152cfe72b36cedba0c5c4/href">https://medium.com/media/aa71d9ed455152cfe72b36cedba0c5c4/href</a></iframe><p>Before going to resources, let’s understand what is HTML?</p><ol><li>HTML is the hypertext markup language that decides how your web page will look like.</li><li>HTML defines the structure of the web page and it is used for creating different web pages.</li><li>HTML particularly discusses the structure of any web page.</li></ol><p>next up let’s talk about some important Concepts that you should be focusing on while learning HTML starting with the</p><ol><li><strong>Different types of semantic tags</strong>: So on any web page there are different types of tags so you should be aware of different semantic tags which define the structure of a web page.</li><li><strong>HTML forms</strong>: On the webpage, there is one important part of taking input from the user and working accordingly so you should be aware of HTML forms.</li><li><strong>HTML tables</strong>: you should be aware of HTML tables so that you can create different tables of different sizes.</li><li><strong>HTML media:</strong> In<strong> </strong>HTML media you should be aware of three tags which are image video and audio tags.</li></ol><p>So up until this point in time, we have talked about what is HTML and what are the different important topics that you should be focusing on while learning HTML.</p><p>Let’s talk about the resources. So in this particular blog, I will be sharing two types of resources. The first one is documentation. Documentation will help you to learn any technology, as well as it will serve you as a reference if you need help in the future. The next type of resource is video tutorials.</p><p>Starting with the resources</p><ol><li><strong><em>w3schools</em></strong></li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*f3v3fE3IpurJSL7e_V5ZIg.png" /></figure><p><strong><em>2. MDN Docs</em></strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OCK1X44K7-ds4F5w0CSDDQ.png" /></figure><p><strong><em>3. html.com</em></strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*80R--JqcgsMM2gl5pupxTQ.png" /></figure><p><strong><em>4. Tutorial by freecodecamp</em></strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9usmGmNfux5ZxzjP--5itA.png" /></figure><p><strong><em>5. Crash course by traverse media</em></strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/977/1*fpOViY7-aiQwK5tgAjapFg.png" /></figure><p><strong><em>6. Crash course by Programming with Mosh</em></strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*C12aQOA7tesH83alIP5raA.png" /></figure><p><strong><em>7. Tutorial by CodeWithHarry</em></strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*o4ga-aOVs2cEAJXc0CkXgg.png" /></figure><p><strong>Resources Link (Notion Page) 🧑🏼‍💻</strong>: <a href="https://wobbly-jade-693.notion.site/HTML-83767e7c2a34486abac51510f94c3ffc">https://wobbly-jade 693.notion.site/HTML-83767e7c2a34486abac51510f94c3ffc</a></p><p>You can watch this particular video from my channel for a better understanding:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fzmx4u6xJamM%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dzmx4u6xJamM&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fzmx4u6xJamM%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/ed1887f2bc52c7643651e997fb18030d/href">https://medium.com/media/ed1887f2bc52c7643651e997fb18030d/href</a></iframe><p>Get in Touch with me: <a href="https://linktr.ee/Devgrammer">https://linktr.ee/Devgramme</a>r</p><p>Follow <a href="https://medium.com/u/29c32629ec39">Devgrammer - Sanket Jagdale</a><a href="https://studio.youtube.com/channel/UCDHD9y7jVgO3Xtsb7rShMxw"> </a>for more !!!</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2FfxI1G5PNC5esyNlIUs%2Ftwitter%2Fiframe&amp;display_name=Giphy&amp;url=https%3A%2F%2Fmedia.giphy.com%2Fmedia%2FfxI1G5PNC5esyNlIUs%2Fgiphy.gif&amp;image=https%3A%2F%2Fi.giphy.com%2Fmedia%2FfxI1G5PNC5esyNlIUs%2Fgiphy.gif&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=giphy" width="435" height="435" frameborder="0" scrolling="no"><a href="https://medium.com/media/5f24f174853b2ccb987740b73a418097/href">https://medium.com/media/5f24f174853b2ccb987740b73a418097/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ba8b9ff74025" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How I Earned 40,000rs on My First Freelancing Project: Experience and Lessons Learned]]></title>
            <link>https://devgrammer.medium.com/how-i-earned-40-000rs-on-my-first-freelancing-project-experience-and-lessons-learned-f5d47ab1b3b9?source=rss-29c32629ec39------2</link>
            <guid isPermaLink="false">https://medium.com/p/f5d47ab1b3b9</guid>
            <category><![CDATA[mern-stack]]></category>
            <category><![CDATA[careers]]></category>
            <category><![CDATA[freelancing]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[sql]]></category>
            <dc:creator><![CDATA[Sanket Jagdale]]></dc:creator>
            <pubDate>Sat, 08 Apr 2023 03:41:13 GMT</pubDate>
            <atom:updated>2023-04-08T03:54:19.153Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-rt7vNGJHr2b8132Fp_T7w.jpeg" /></figure><p>As a Web Developer, I have been building numerous side projects, learning new technologies, and doing internships. However, I recently decided to explore a new dimension and started freelancing. I was excited to try something new and expand my skillset in many aspects.</p><p>Looking back on the experience, I realized that there were many valuable lessons I learned along the way. In this blog post, I’ll share my experience and the main lessons I learned from my first freelance project.</p><p><strong>Contents :</strong></p><ol><li>Finding the Freelancing Project</li><li>Project Scope and Requirements</li><li>Client Communication</li><li>Timeline and Deliverables</li><li>Challenges faced</li><li>Lessons Learned</li><li>Conclusion</li></ol><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2FflbcUFdLSHwZC03p11%2Ftwitter%2Fiframe&amp;display_name=Giphy&amp;url=https%3A%2F%2Fmedia.giphy.com%2Fmedia%2FflbcUFdLSHwZC03p11%2Fgiphy.gif&amp;image=https%3A%2F%2Fmedia4.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExcnJha3YxOGo4cGlsMWJrZHRtaTU4MDNyazNkNDVmNnd5M3B0YW9teiZlcD12MV9naWZzX2dpZklkJmN0PWc%2FflbcUFdLSHwZC03p11%2Fgiphy.gif&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=giphy" width="435" height="268" frameborder="0" scrolling="no"><a href="https://medium.com/media/75f65a7d8a7c8948f770ef420203dd44/href">https://medium.com/media/75f65a7d8a7c8948f770ef420203dd44/href</a></iframe><ol><li><strong>Finding the Freelance Project:</strong></li></ol><p>I landed my first client through a mutual network. The client was initially in contact with my friend, who told me about the client’s project requirements. I decided to seize this opportunity and called the client to discuss the project further.</p><p>The client then provided me with the contact information of the technical guy at their company and suggested that we should discuss the technical aspects of the project first. If everything went well, we could then discuss the financials.</p><p>I was excited to move forward, so the very next day, I contacted the technical expert to discuss the project. After a call where we discussed an overview of the project and his requirements, I was confident that I could complete the job. I called the client back to talk about the financials, and we discussed different phases, such as the advance payment, payment after design, and payment after hand-off. After negotiations from both sides, we agreed on a total amount of 40,000rs.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2FLZ2WRdQu8udNPSZxbg%2Ftwitter%2Fiframe&amp;display_name=Giphy&amp;url=https%3A%2F%2Fmedia.giphy.com%2Fmedia%2FLZ2WRdQu8udNPSZxbg%2Fgiphy.gif&amp;image=https%3A%2F%2Fi.giphy.com%2Fmedia%2FLZ2WRdQu8udNPSZxbg%2Fgiphy.gif&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=giphy" width="435" height="235" frameborder="0" scrolling="no"><a href="https://medium.com/media/5e9d86137d36e02cb70342a6b9dd1495/href">https://medium.com/media/5e9d86137d36e02cb70342a6b9dd1495/href</a></iframe><p><strong>2. Project Scope and Requirements</strong></p><p>My task was to design and develop a full-stack website for the company. This involved creating the website’s front-end and back-end components, as well as implementing user authentication, such as login and signup. Additionally, I was responsible for creating dynamic reports and fetching data from the database. The website needed to be user-friendly and visually appealing while also being efficient and responsive. Although there were no limitations or requirements for the tech stack, the database specified for the project was MS SQL.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2F8S9DoZLEaur28JtwqL%2Ftwitter%2Fiframe&amp;display_name=Giphy&amp;url=https%3A%2F%2Fmedia.giphy.com%2Fmedia%2F8S9DoZLEaur28JtwqL%2Fgiphy.gif&amp;image=https%3A%2F%2Fi.giphy.com%2Fmedia%2F8S9DoZLEaur28JtwqL%2Fgiphy.gif&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=giphy" width="435" height="290" frameborder="0" scrolling="no"><a href="https://medium.com/media/03851a0722c0341153bc124d77990722/href">https://medium.com/media/03851a0722c0341153bc124d77990722/href</a></iframe><p><strong>3. Client Communication</strong></p><p>For communication, the client created a WhatsApp group and added 3–4 members from their company. This allowed for seamless modifications and updates to be shared between the team and myself. Throughout the project, we communicated exclusively on this group and through calls, where I provided daily updates on the website’s design, new features, and functionality, complete with screenshots and demos. The client provided valuable feedback and made modifications as necessary, ranging from minor design changes to the addition of new features and functionality. This collaborative communication approach was key to ensuring that the website met the client’s expectations and was delivered on time and within budget.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2F5moPP5GLPQgEHJ5mEp%2Ftwitter%2Fiframe&amp;display_name=Giphy&amp;url=https%3A%2F%2Fmedia.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExMWNlNWQ2MzczZGM5ZTZkMmU3MjdkZTRjMmZhODgxNjExODExYTJmZSZjdD1n%2F5moPP5GLPQgEHJ5mEp%2Fgiphy.gif&amp;image=https%3A%2F%2Fi.giphy.com%2Fmedia%2F5moPP5GLPQgEHJ5mEp%2Fgiphy.gif&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=giphy" width="435" height="435" frameborder="0" scrolling="no"><a href="https://medium.com/media/be8393f317a86044ff5ec3a8574c548f/href">https://medium.com/media/be8393f317a86044ff5ec3a8574c548f/href</a></iframe><p><strong>4. Timeline and Deliverables</strong></p><p>Phase 1: Design Hand-off</p><p>The day after our call, I began designing the website, and within 3 to 4 days, I shared the first draft and a presentation on the WhatsApp group. The client provided valuable feedback, ranging from minor changes such as color and shape modifications to major changes such as altering the navbar’s functionality. I incorporated the feedback and made the necessary changes, providing updated drafts for review on an ongoing basis. and after a week or so we finalized the design.</p><p>Phase 2 : Research and Learning</p><p>Since I was unfamiliar with MS SQL and how to integrate it with Node.js, I turned to the internet for help. Unfortunately, I found very few resources related to MS SQL integration. However, I eventually stumbled upon a great blog post that outlined the integration process step by step.</p><p>Phase 3 : Development</p><p>After conducting the necessary research, I began the development phase and integrated Node.js with a demo MS SQL server. From there, I began creating various frontend components and pushed them to GitHub, allowing the client to review and provide feedback on each iteration. This collaborative approach helped ensure that the client was satisfied with the website’s design and functionality.</p><p>Backend work for the website proved to be quite challenging, particularly due to the company’s strong focus on data analysis. In total, there were 12 large databases, each containing upwards of 100 tables, which made the backend work quite complex and time-consuming.</p><p>To handle this, I broke the backend work down into smaller, more manageable components and developed a clear plan of action. I also utilized various tools and technologies to streamline the development process.</p><p>Phase 4 : Handoff</p><p>After many sleepless nights and putting in a lot of hard work, I was finally able to hand off the completed project to the client. The feeling of relief and satisfaction was immense, as I had worked tirelessly to ensure that the website met all of the client’s requirements and was functioning perfectly. The handoff process went quite smoothly, and I was able to provide the client with all the necessary documentation and support for the website’s maintenance and upkeep.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2FZVik7pBtu9dNS%2Ftwitter%2Fiframe&amp;display_name=Giphy&amp;url=https%3A%2F%2Fmedia.giphy.com%2Fmedia%2FZVik7pBtu9dNS%2Fgiphy.gif&amp;image=https%3A%2F%2Fi.giphy.com%2Fmedia%2FZVik7pBtu9dNS%2Fgiphy.gif&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=giphy" width="435" height="242" frameborder="0" scrolling="no"><a href="https://medium.com/media/98320c862b2e285ee70810a5e350c5ac/href">https://medium.com/media/98320c862b2e285ee70810a5e350c5ac/href</a></iframe><p><strong>5. Overcoming the Challenges Faced</strong></p><ol><li>It’s not uncommon for clients to prioritize functionality over demos or screenshots, especially when it comes to backend work. However, it can be challenging when you’re in the design phase and not yet ready to implement certain features.</li><li>Integrating MS SQL with your Nodejs server was a particularly challenging task. It’s perfectly normal to feel impatient or frustrated when working on something new and unfamiliar, but it’s important to remember that every new skill takes time to master.</li><li>On top of that, balancing schoolwork and client demands can be tough. It’s important to manage your time effectively and communicate clearly with your client to ensure that their needs are being met while also prioritizing your own responsibilities.</li><li>Overall, working on a complex project can be challenging, but with patience, persistence, and effective time management, you can successfully deliver a high-quality product that meets your client’s needs.</li></ol><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2FzOvBKUUEERdNm%2Ftwitter%2Fiframe&amp;display_name=Giphy&amp;url=https%3A%2F%2Fmedia.giphy.com%2Fmedia%2FzOvBKUUEERdNm%2Fgiphy.gif&amp;image=https%3A%2F%2Fi.giphy.com%2Fmedia%2FzOvBKUUEERdNm%2F200.gif&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=giphy" width="435" height="244" frameborder="0" scrolling="no"><a href="https://medium.com/media/86553f00f87665ef0db4d3063444dacc/href">https://medium.com/media/86553f00f87665ef0db4d3063444dacc/href</a></iframe><p><strong>6. Lessons Learned</strong></p><ol><li>When embarking on a new freelance project, creating/asking for detailed documentation of all the requirements and project details can be incredibly beneficial. This documentation acts as a reference point for both you and your client, ensuring that everyone is on the same page and there is no ambiguity regarding the project’s scope. Additionally, having clear and detailed documentation can also be useful for negotiation purposes in the later stages of the project.</li><li>Learning something new can be a challenging and time-consuming process, but it’s essential for growth and development. Whether you’re learning a new programming language or a new skill, it’s important to be patient throughout the process. Don’t fall into the trap of tutorial hell, where you spend all your time watching tutorials and never actually putting what you’ve learned into practice. Instead, take the time to learn a new concept or skill, then use it to build something. This will help you solidify your understanding of the topic and give you a chance to apply what you’ve learned in a practical way.</li></ol><p><strong>7. Conclusion</strong></p><p>In conclusion, working on this project was a great experience for me, and I learned a lot from it. From managing client expectations to working with new technologies, it was a perfect roller coaster ride. I gained a lot of confidence in my abilities as a full-stack developer and learned to work more efficiently and effectively under tight deadlines. This experience has also taught me the importance of clear communication, the value of timely updates, and the value of collaborating with the client throughout the project. I am proud of the work I accomplished on this project and am excited to apply these learnings to my future projects.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2FxHMIDAy1qkzNS%2Ftwitter%2Fiframe&amp;display_name=Giphy&amp;url=https%3A%2F%2Fmedia.giphy.com%2Fmedia%2FxHMIDAy1qkzNS%2Fgiphy.gif&amp;image=https%3A%2F%2Fi.giphy.com%2Fmedia%2FxHMIDAy1qkzNS%2F200.gif&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=giphy" width="435" height="321" frameborder="0" scrolling="no"><a href="https://medium.com/media/3fd7bfc47a16c80fbc4a0e131ef54beb/href">https://medium.com/media/3fd7bfc47a16c80fbc4a0e131ef54beb/href</a></iframe><p>In the end, Thank you for reading this blog, I will be coming up with more useful experiences in the future, so follow <a href="https://medium.com/u/29c32629ec39">Devgrammer - Sanket Jagdale</a> and stay tuned !!!</p><p>Written by — Sanket Jagdale (<a href="https://linktr.ee/sanket00900">https://linktr.ee/sanket00900</a>)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f5d47ab1b3b9" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>