<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sheshbabu</title>
    <description>The latest articles on DEV Community by Sheshbabu (@sheshbabu).</description>
    <link>https://dev.to/sheshbabu</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F278079%2Fbfa7d828-8280-4a38-92c2-6f0e4aef44f9.jpeg</url>
      <title>DEV Community: Sheshbabu</title>
      <link>https://dev.to/sheshbabu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sheshbabu"/>
    <language>en</language>
    <item>
      <title>Visual explanation of SAML authentication</title>
      <dc:creator>Sheshbabu</dc:creator>
      <pubDate>Fri, 26 Jun 2020 04:33:25 +0000</pubDate>
      <link>https://dev.to/sheshbabu/visual-explanation-of-saml-authentication-3de0</link>
      <guid>https://dev.to/sheshbabu/visual-explanation-of-saml-authentication-3de0</guid>
      <description>&lt;p&gt;SAML (Security Assertion Markup Language) is the most commonly used authentication protocol and SSO solution in enterprises.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is SSO?
&lt;/h2&gt;

&lt;p&gt;To put it simply, it's the enterprise equivalent of the "Login with Google" or "Login with Facebook" buttons we see in apps around the internet. We register an account initially in Google or Facebook etc and use that account to login to other apps like Spotify, Netflix, Zoom etc. We do this to avoid maintaining multiple username/passwords. Similarly, enterprises maintain a single user management system and employees use their corporate account to login to third-party services like Salesforce, Workday, Expensify etc without creating separate accounts or remembering multiple passwords. This is called SSO (Single Sign On) and SAML is the de facto enterprise SSO solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Participants
&lt;/h2&gt;

&lt;p&gt;There are 3 main participants involved in the SAML authentication flow:&lt;/p&gt;

&lt;h3&gt;
  
  
  Identity Provider (IdP)
&lt;/h3&gt;

&lt;p&gt;This is the centralised user management system that we talked about earlier. This server is responsible for authenticating the user and passing the user details such as email address, name, department etc to the Service Provider. Popular identity providers are Azure AD, Auth0, Onelogin, Okta, G Suite etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Service Provider (SP)
&lt;/h3&gt;

&lt;p&gt;This is the application that trusts the IdP and wants to use it for authentication. Examples: Salesforce, Workday, Expensify, $YOUR_AWESOME_APP etc&lt;/p&gt;

&lt;h3&gt;
  
  
  Principal
&lt;/h3&gt;

&lt;p&gt;This is the user who's trying to log into the SP via the IdP.&lt;/p&gt;

&lt;h2&gt;
  
  
  Authentication Flows
&lt;/h2&gt;

&lt;p&gt;There are two common ways for an user to access SP:&lt;/p&gt;

&lt;h3&gt;
  
  
  IdP initiated login:
&lt;/h3&gt;

&lt;p&gt;The user goes to the IdP first and is shown a list of SP they have access to. Upon choosing an SP from that list, they're redirected to that SP.&lt;/p&gt;

&lt;h3&gt;
  
  
  SP initiated login:
&lt;/h3&gt;

&lt;p&gt;In this flow, the user goes to the SP's website first. If the user doesn't have an active session with the SP, the user is redirected to the IdP for authentication. Upon successful login, the user is redirected back to the SP. We'll be discussing this flow in detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  SP initiated Flow:
&lt;/h2&gt;

&lt;p&gt;Let's talk about the flow from the user's perspective.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The user goes to the SP's website. If the user is not logged in, it shows a "Login with SSO" button&lt;/li&gt;
&lt;li&gt;Upon clicking the login button, the user is redirected to the IdP's website where they're asked to submit their credentials&lt;/li&gt;
&lt;li&gt;Upon successful login, the user is redirected back to the SP's website where they can perform their work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_qcUIJc9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/v8vvlgseselp3m5eh2ah.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_qcUIJc9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/v8vvlgseselp3m5eh2ah.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, let's zoom in a bit and understand what happens behind the scenes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SP checks for active session&lt;/li&gt;
&lt;li&gt;SP sends AuthnRequest to IdP&lt;/li&gt;
&lt;li&gt;IdP authenticates the user&lt;/li&gt;
&lt;li&gt;IdP sends SAML Assertion to SP&lt;/li&gt;
&lt;li&gt;SP creates session and logs in user&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  SP checks for active session
&lt;/h3&gt;

&lt;p&gt;SAML doesn't maintain sessions, so SP needs to maintain sessions for each authenticated user. When a user visits the SP website, it checks whether the user has an active session with it. If an active session exists, the user can enter the website otherwise a "Login with SSO" button is shown.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g2pFHodp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/oll1ak6e10zml79jxkwf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g2pFHodp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/oll1ak6e10zml79jxkwf.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  SP sends AuthRequest to IdP
&lt;/h3&gt;

&lt;p&gt;When the user clicks on the "Login with SSO" button, the SP generates a XML message called "AuthnRequest" with details about who's sending the request (Issuer), where to redirect to after the user is authenticated (Assertion Consumer Service url) and security measures (ID, IssueInstant). Here's an &lt;a href="https://www.samltool.com/generic_sso_req.php"&gt;example AuthnRequest XML&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This XML is encoded into a url-safe string, embedded as query param in a request to IdP and the user is redirected to this IdP url:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://idp.com/SAML2/SSO/Redirect?SAMLRequest=EncodedAuthnRequest&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  IdP authenticates the user
&lt;/h3&gt;

&lt;p&gt;IdP maintains its own session about the user and if an active session exists for the user, the user is redirected to SP. If a session doesn't exist, the user is asked to enter their credentials. The IdP can choose how to authenticate the user - can be Username/Password, TOTP, MFA etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  IdP sends SAML Assertion to SP
&lt;/h3&gt;

&lt;p&gt;Once the user is successfully authenticated, IdP sends back an XML message called "SAML Assertion" to the SP's Assertion Consumer Service url. This contains the user's details such as name, email, department etc and security measures (InResponseTo, IssueInstant). It's also digitally signed so the SP can trust that the message is indeed from IdP and login the user into their system.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RV6Jhf0T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/99xo5ozdflvjo7rk8fgv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RV6Jhf0T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/99xo5ozdflvjo7rk8fgv.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  SP creates session and logs in user
&lt;/h3&gt;

&lt;p&gt;The user is now successfully logged in to the SP's website! The SP will create a session for the user so the user can be automatically logged in the next time they visit the website.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Hopefully this post is able to give you a high level overview of SAML authentication and how the SSO works.&lt;/p&gt;

&lt;p&gt;Originally posted in &lt;a href="http://www.sheshbabu.com/posts/visual-explanation-of-saml-authentication/"&gt;sheshbabu.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading! :)&lt;/p&gt;

</description>
      <category>saml</category>
      <category>authentication</category>
      <category>enterprise</category>
      <category>sso</category>
    </item>
    <item>
      <title>Minimal Viable Search using Postgres</title>
      <dc:creator>Sheshbabu</dc:creator>
      <pubDate>Sun, 01 Dec 2019 10:54:05 +0000</pubDate>
      <link>https://dev.to/sheshbabu/minimal-viable-search-using-postgres-jlg</link>
      <guid>https://dev.to/sheshbabu/minimal-viable-search-using-postgres-jlg</guid>
      <description>&lt;p&gt;If you’re building a product, you might have deprioritized building the search feature thinking that it might take a long time to build. If you happen to be using Postgres, let me show you a quick and easy way to implement the search functionality. &lt;/p&gt;

&lt;h1&gt;
  
  
  Test drive
&lt;/h1&gt;

&lt;p&gt;Let’s say you’re building an ecommerce app and you want to be able to search on the product descriptions. This can be done using the following query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;
  &lt;span class="n"&gt;products&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt;
  &lt;span class="n"&gt;to_tsvector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;@@&lt;/span&gt; &lt;span class="n"&gt;websearch_to_tsquery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'chocolate milk'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;TRUE&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;If you have a test database lying around, you can quickly try this out by replacing the table name, column name and search query. If you're using Postgres 10 or below, "websearch_to_tsquery" won't work. use "plainto_tsquery" instead.&lt;/p&gt;

&lt;p&gt;Now, you might be having a lot of questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"to_tsvector", "websearch_to_tsquery", "@@" look weird!&lt;/li&gt;
&lt;li&gt;How's this different from "LIKE"?&lt;/li&gt;
&lt;li&gt;How to make this faster?&lt;/li&gt;
&lt;li&gt;What are the tradeoffs compared to ElasticSearch?&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  ts_what?
&lt;/h1&gt;

&lt;p&gt;"ts" stands for Text Search. &lt;/p&gt;

&lt;p&gt;At the very minimum, you need to only learn four things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use "to_tsvector" function on the columns you're searching on&lt;/li&gt;
&lt;li&gt;Use "websearch_to_tsquery" function for the search query&lt;/li&gt;
&lt;li&gt;Use the match operator "@@" to see if the above two match&lt;/li&gt;
&lt;li&gt;Use "ts_rank" function to sort the results based on relevancy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In simple terms, &lt;code&gt;to_tsvector&lt;/code&gt; breaks down text into list of keywords and their positions. Running&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;to_tsvector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'A journey of a thousand miles begins with a single step'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;gives&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="s1"&gt;'begin'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="s1"&gt;'journey'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="s1"&gt;'mile'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="s1"&gt;'singl'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="s1"&gt;'step'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="s1"&gt;'thousand'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Notice that the &lt;a href="https://en.wikipedia.org/wiki/Stop_words"&gt;words&lt;/a&gt; "A", "of" and "with" are removed as they're not useful in searching, the word "single" is normalized to its root form "singl" so it appears in more searches, the word "miles" is reduced to its singular form. This also takes care of normalizing the text to lowercase and removing special characters.&lt;/p&gt;

&lt;p&gt;The function &lt;code&gt;websearch_to_tsquery&lt;/code&gt; converts the user submitted search term into something that Postgres can understand. You can use Google style search queries like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jaguar speed -car

ipad OR iphone

"chocolate chip" recipe
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can also try other query functions like "plainto_tsquery" or "phraseto_tsquery" which have their own way of parsing the search queries.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;@@&lt;/code&gt; operator matches the above search query with text from column. You can also use the &lt;code&gt;||&lt;/code&gt; operator to concatenate multiple columns together and search on them.&lt;/p&gt;

&lt;p&gt;The function ts_rank is used for sorting the search results by relevancy. The way it determines relevancy is by looking at how frequent the search terms appear, how close together they appear, in what position they appear etc.&lt;/p&gt;

&lt;p&gt;By now you should have a good idea about how this is different from normal LIKE or pattern matching.&lt;/p&gt;

&lt;h1&gt;
  
  
  Making it faster
&lt;/h1&gt;

&lt;p&gt;Instead of building tsvectors everytime we query using to_tsvector, we can store it in a separate column when the record is created/updated. For this, we create the following trigger:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="k"&gt;FUNCTION&lt;/span&gt; &lt;span class="n"&gt;fn_on_product_insert_store_tsv&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;RETURNS&lt;/span&gt; &lt;span class="k"&gt;trigger&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
  &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tsv&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;to_tsvector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt;
&lt;span class="k"&gt;LANGUAGE&lt;/span&gt; &lt;span class="s1"&gt;'plpgsql'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TRIGGER&lt;/span&gt; &lt;span class="n"&gt;trg_on_product_insert_store_tsv&lt;/span&gt;
&lt;span class="k"&gt;BEFORE&lt;/span&gt; &lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;
&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="k"&gt;EACH&lt;/span&gt; &lt;span class="k"&gt;ROW&lt;/span&gt;
&lt;span class="k"&gt;EXECUTE&lt;/span&gt; &lt;span class="k"&gt;PROCEDURE&lt;/span&gt; &lt;span class="n"&gt;fn_on_product_insert_create_tsv&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Let's also add an index on this column to make the queries faster:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;tsv_idx&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tsv&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This should greatly speed up your seach queries.&lt;/p&gt;

&lt;h1&gt;
  
  
  Comparison to ElasticSearch
&lt;/h1&gt;

&lt;p&gt;ElasticSearch is synonymous with product search these days so you need to be aware of the tradeoffs:&lt;/p&gt;

&lt;p&gt;When Postgres is better than ElasticSearch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One less dependency to manage or get approval for&lt;/li&gt;
&lt;li&gt;Faster time to market - can see how your users are using search and decide if you need to use ElasticSearch for more sophisticated search features&lt;/li&gt;
&lt;li&gt;There's a single source of truth for the data - no need to keep multiple datastores in sync&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When ElasticSearch is better than Postgres:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If your team already has expertise in ElasticSearch&lt;/li&gt;
&lt;li&gt;Scale search queries seperately from normal database queries&lt;/li&gt;
&lt;li&gt;You need support for &lt;a href="https://stackoverflow.com/questions/5321595/what-is-faceted-search"&gt;facets&lt;/a&gt;. Here's a &lt;a href="https://roamanalytics.com/2019/04/16/faceted-search-with-postgres-using-tsvector/"&gt;simple implementation&lt;/a&gt; of facets in Postgres&lt;/li&gt;
&lt;li&gt;More flexible and sophisticated search features&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Follow me on &lt;a href="https://twitter.com/sheshbabu"&gt;Twitter&lt;/a&gt; ❤️&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>search</category>
      <category>elasticsearch</category>
    </item>
    <item>
      <title>Career advice for new developers</title>
      <dc:creator>Sheshbabu</dc:creator>
      <pubDate>Sat, 30 Nov 2019 05:56:53 +0000</pubDate>
      <link>https://dev.to/sheshbabu/career-advice-for-new-developers-3l3</link>
      <guid>https://dev.to/sheshbabu/career-advice-for-new-developers-3l3</guid>
      <description>&lt;p&gt;Hello, my name is Shesh and I've been working in this industry for more than &lt;a href="http://linkedin.com/in/sheshbabu/"&gt;10 years&lt;/a&gt;. I've been meaning to write this post for a very long time - not only for others but also for what I wish I was told when I first started working as a developer. Hope you find this useful! 😊&lt;/p&gt;




&lt;h1&gt;
  
  
  Take care of your health ❤️
&lt;/h1&gt;

&lt;p&gt;Software development is not a physically demanding work like farming or factory work, but you &lt;em&gt;are&lt;/em&gt; spending a lot of hours sitting and starting at a screen. &lt;/p&gt;

&lt;p&gt;You might be healthy now but unfortunately, as you age, your vision gets blurry, your wrists or back start hurting etc.&lt;/p&gt;

&lt;p&gt;This might not happen to everyone - There are plenty of developers who are in their 40s, 50s and above without these issues, but why take chances? &lt;/p&gt;

&lt;p&gt;Take a break from work now and then. Earth will still be spinning after you return from break 😂&lt;/p&gt;

&lt;h1&gt;
  
  
  Learn the basics 🧱
&lt;/h1&gt;

&lt;p&gt;There is a huge gap between what's taught in universities and how we work in the industry. Unless you're lucky, you don't learn about how to use a debugger, source control, terminal, regex etc when you start your first job. &lt;/p&gt;

&lt;p&gt;Make time to learn about these foundational concepts as you go about your job. It'll be useful for your entire career 👍&lt;/p&gt;

&lt;h1&gt;
  
  
  Tools don't make you better 🛠
&lt;/h1&gt;

&lt;p&gt;Using Vi/Emacs doesn't make you an awesome developer. Similarly, using Sublime Text or Notepad++ doesn't make you a bad developer. Same applies for languages, frameworks etc.&lt;/p&gt;

&lt;p&gt;If you can complete your tasks and feel productive with the tools, continue using it. Don't tie your self worth with the tools you use. &lt;/p&gt;

&lt;h1&gt;
  
  
  Don’t outsource your decisions 🧟‍♀️
&lt;/h1&gt;

&lt;p&gt;Don't blindly do something just because Google/Facebook/etc are doing it.&lt;/p&gt;

&lt;p&gt;Each software project is different in terms of scope, business value, people involved, their skills, how long the project is going to be maintained etc.&lt;/p&gt;

&lt;p&gt;Engineering is all about tradeoffs. Ask yourself: in which context a particular advice makes sense. This is the only way you'll learn.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don't blindly use Kubernetes/Golang/React/Mongo for a static website which can be written in plain HTML and served by a single Nginx box.&lt;/li&gt;
&lt;li&gt;If business urgently wants a throwaway website that will be only used for 2 weeks, don't try to build it using TDD etc&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Don't be a code monkey 🙈
&lt;/h1&gt;

&lt;p&gt;Your job is not to write code but to solve business problems. &lt;/p&gt;

&lt;p&gt;So, when you're given some problems or tasks, try to understand what business problem you're solving. Ask as many questions as needed for you to understand. It's okay 👍&lt;/p&gt;

&lt;p&gt;Once you know what you're solving, there are good chances that you can come up with better solutions or solutions that can be implemented faster. Propose these solutions, most of times they'll get accepted. Else you'll be told why your solution won't work in that scenario. In which case, you have learnt something and can make better suggestions in future. &lt;/p&gt;

&lt;h1&gt;
  
  
  Don’t stop learning 📖
&lt;/h1&gt;

&lt;p&gt;You'll be learning a lot of new technologies and processes now that you're new. But over years, you'll get comfortable and stop learning. &lt;/p&gt;

&lt;p&gt;Technology advances super fast. While it's impossible to learn everything new that's coming up, it's better to be aware of the new things that are slowly becoming the industry standard and learn about it when you have free time.&lt;/p&gt;

&lt;p&gt;Your peers, leads, managers are all in the same boat. See if you already have learning sessions in your company. If not, you can suggest starting one and most of the time, people will be supportive 👍&lt;/p&gt;

&lt;h1&gt;
  
  
  Keep notes 📝
&lt;/h1&gt;

&lt;p&gt;Unless you have a really good memory, try to take notes about a particular process, technology, how to do x etc. &lt;/p&gt;

&lt;p&gt;Most of the time, we end up doing something that we did 2-3 years back (vertically centre something in CSS 😅, implement login flow, upload a file to S3 etc).&lt;/p&gt;

&lt;p&gt;When you have notes, you can reach out to it and implement the solution quickly instead of googling about how to do it and scrolling through pages and pages of StacknOverflow and GitHub issues.&lt;/p&gt;

&lt;p&gt;Even better, blog about it so that it also helps others 😊&lt;/p&gt;




&lt;p&gt;Follow me on &lt;a href="https://twitter.com/sheshbabu"&gt;Twitter&lt;/a&gt; ❤️&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>career</category>
    </item>
  </channel>
</rss>
