Software Engineering Principles

Explore top LinkedIn content from expert professionals.

  • View profile for Brij kishore Pandey
    Brij kishore Pandey Brij kishore Pandey is an Influencer

    AI Architect | AI Engineer | Generative AI | Agentic AI

    708,531 followers

    Demystifying the Software Testing 1️⃣ 𝗙𝘂𝗻𝗰𝘁𝗶𝗼𝗻𝗮𝗹 𝗧𝗲𝘀𝘁𝗶𝗻𝗴: 𝗧𝗵𝗲 𝗕𝗮𝘀𝗶𝗰𝘀: Unit Testing: Isolating individual code units to ensure they work as expected. Think of it as testing each brick before building a wall. Integration Testing: Verifying how different modules work together. Imagine testing how the bricks fit into the wall. System Testing: Putting it all together, ensuring the entire system functions as designed. Now, test the whole building for stability and functionality. Acceptance Testing: The final hurdle! Here, users or stakeholders confirm the software meets their needs. Think of it as the grand opening ceremony for your building. 2️⃣ 𝗡𝗼𝗻-𝗙𝘂𝗻𝗰𝘁𝗶𝗼𝗻𝗮𝗹 𝗧𝗲𝘀𝘁𝗶𝗻𝗴: 𝗕𝗲𝘆𝗼𝗻𝗱 𝘁𝗵𝗲 𝗕𝗮𝘀𝗶𝗰𝘀: ️ Performance Testing: Assessing speed, responsiveness, and scalability under different loads. Imagine testing how many people your building can safely accommodate. Security Testing: Identifying and mitigating vulnerabilities to protect against cyberattacks. Think of it as installing security systems and testing their effectiveness. Usability Testing: Evaluating how easy and intuitive the software is to use. Imagine testing how user-friendly your building is for navigation and accessibility. 3️⃣ 𝗢𝘁𝗵𝗲𝗿 𝗧𝗲𝘀𝘁𝗶𝗻𝗴 𝗔𝘃𝗲𝗻𝘂𝗲𝘀: 𝗧𝗵𝗲 𝗦𝗽𝗲𝗰𝗶𝗮𝗹𝗶𝘇𝗲𝗱 𝗖𝗿𝗲𝘄: Regression Testing: Ensuring new changes haven't broken existing functionality. Imagine checking your building for cracks after renovations. Smoke Testing: A quick sanity check to ensure basic functionality before further testing. Think of turning on the lights and checking for basic systems functionality before a deeper inspection. Exploratory Testing: Unstructured, creative testing to uncover unexpected issues. Imagine a detective searching for hidden clues in your building. Have I overlooked anything? Please share your thoughts—your insights are priceless to me.

  • View profile for Vishakha Sadhwani

    Sr. Solutions Architect at Nvidia | Ex-Google, AWS | 100k+ Linkedin | EB1-A Recipient | Follow to explore your career path in Cloud | DevOps | *Opinions.. my own*

    139,236 followers

    If you want to get a job as a Cloud DevOps engineer, don't start with the most in-demand tools like Terraform, Kubernetes, or Prometheus Sure, you've probably heard everyone talking about the latest DevOps tools like they're the key ingredient for success… truth is – they're not. Tools will come and go. But knowing why they exist and fundamentals? They are crucial. Focus on knowing these basics first! The key topics: 🔑 DevOps Lifecycle & Methodologies → Master the complete DevOps lifecycle (Plan, Code, Build, Test, Deploy, Operate, Monitor). Understand SDLC and Agile principles - they're the backbone of DevOps culture. Start here: https://lnkd.in/dK392At2 🔑 Linux & Shell Scripting → Every automation starts here. Mastering Linux, bash, and shell scripting is foundational for any DevOps role. Start here: Linux Journey - https://linuxjourney.com/ 🔑 Networking Fundamentals → Cloud or on-premise, it's all about connecting systems. Understanding TCP/IP, DNS, load balancing, and routing helps troubleshoot infrastructure. Start here: https://lnkd.in/dD7gCCZ6 Also this: Practical Networking - https://lnkd.in/dQqKV8SQ 🔑 Version Control & Git → Beyond just push and pull. Understanding branching strategies, merge conflicts, and Git workflows will save you countless hours of headache. Start here: Git Branching - https://lnkd.in/d9knsWzc 🔑 CI/CD Principles → Before Jenkins or GitHub Actions, understand what makes a good pipeline, testing strategies, and deployment patterns. Start here: Continuous Delivery - https://lnkd.in/d86yakEG 🔑 Infrastructure as Code Concepts → Don't start with Terraform. Understand idempotency, state management, and infrastructure lifecycle first. Start here: https://lnkd.in/dFyG5uXD Also this: https://lnkd.in/dSzzgWei There are other key areas – like understanding deployment strategies, logging, monitoring, alerting and more – which can further solidify your basics and help you learn any tool. Just a reminder: tools will keep evolving, but these foundational skills will help you adapt to any new DevOps platform or cloud service for that matter. Learn the concepts, and the tools become just an implementation detail! If you find these helpful... 🔔 Follow Vishakha Sadhwani for more Cloud & DevOps content ♻️ Share so more people can learn.

  • View profile for Mohan Nayak

    Data Analyst @ Jodas Expoim Pvt Ltd | Microsoft Power BI, DAX

    55,619 followers

    𝗧𝘆𝗽𝗲𝘀 𝗼𝗳 𝗦𝗼𝗳𝘁𝘄𝗮𝗿𝗲 𝗧𝗲𝘀𝘁𝗶𝗻𝗴: 𝗔 𝗖𝗼𝗺𝗽𝗿𝗲𝗵𝗲𝗻𝘀𝗶𝘃𝗲 𝗢𝘃𝗲𝗿𝘃𝗶𝗲𝘄 𝟭. 𝗠𝗮𝗻𝘂𝗮𝗹 𝗧𝗲𝘀𝘁𝗶𝗻𝗴 Manual testing involves human effort to identify bugs and ensure the software meets requirements. It includes: 𝐖𝐡𝐢𝐭𝐞 𝐁𝐨𝐱 𝐓𝐞𝐬𝐭𝐢𝐧𝐠: Focuses on the internal structure and logic of the code. 𝐁𝐥𝐚𝐜𝐤 𝐁𝐨𝐱 𝐓𝐞𝐬𝐭𝐢𝐧𝐠: Concentrates on the functionality without knowledge of the internal code. 𝐆𝐫𝐞𝐲 𝐁𝐨𝐱 𝐓𝐞𝐬𝐭𝐢𝐧𝐠: Combines both White Box and Black Box techniques, giving partial insight into the code. 𝟮. 𝗔𝘂𝘁𝗼𝗺𝗮𝘁𝗶𝗼𝗻 𝗧𝗲𝘀𝘁𝗶𝗻𝗴 Automation testing uses scripts and tools to execute tests efficiently, ensuring faster results for repetitive tasks. This approach complements manual testing by reducing time and effort. 𝟯. 𝗙𝘂𝗻𝗰𝘁𝗶𝗼𝗻𝗮𝗹 𝗧𝗲𝘀𝘁𝗶𝗻𝗴 Functional testing verifies that the application behaves as expected and satisfies functional requirements. Subtypes include: 𝐔𝐧𝐢𝐭 𝐓𝐞𝐬𝐭𝐢𝐧𝐠: Validates individual components or units of the application. 𝐔𝐬𝐚𝐛𝐢𝐥𝐢𝐭𝐲 𝐓𝐞𝐬𝐭𝐢𝐧𝐠: Ensures the application is user-friendly and intuitive. 𝗙𝘂𝗻𝗰𝘁𝗶𝗼𝗻𝗮𝗹 𝘁𝗲𝘀𝘁𝗶𝗻𝗴 𝗳𝘂𝗿𝘁𝗵𝗲𝗿 𝗲𝘅𝘁𝗲𝗻𝗱𝘀 𝘁𝗼 :- 𝐈𝐧𝐭𝐞𝐠𝐫𝐚𝐭𝐢𝐨𝐧 𝐓𝐞𝐬𝐭𝐢𝐧𝐠: Tests the interaction between integrated modules. It has two methods: 𝗜𝗻𝗰𝗿𝗲𝗺𝗲𝗻𝘁𝗮𝗹 𝗧𝗲𝘀𝘁𝗶𝗻𝗴 :- 𝐁𝐨𝐭𝐭𝐨𝐦-𝐔𝐩 𝐀𝐩𝐩𝐫𝐨𝐚𝐜𝐡: Starts testing with lower-level modules. 𝐓𝐨𝐩-𝐃𝐨𝐰𝐧 𝐀𝐩𝐩𝐫𝐨𝐚𝐜𝐡: Begins testing with higher-level modules. 𝐍𝐨𝐧-𝐈𝐧𝐜𝐫𝐞𝐦𝐞𝐧𝐭𝐚𝐥 𝐓𝐞𝐬𝐭𝐢𝐧𝐠: Tests all modules as a single unit. 𝐒𝐲𝐬𝐭𝐞𝐦 𝐓𝐞𝐬𝐭𝐢𝐧𝐠: Tests the entire system as a whole to ensure it meets specified requirements. 𝟰. 𝗡𝗼𝗻-𝗙𝘂𝗻𝗰𝘁𝗶𝗼𝗻𝗮𝗹 𝗧𝗲𝘀𝘁𝗶𝗻𝗴 Non-functional testing evaluates the performance, reliability, scalability, and other non-functional aspects of the application. Key subtypes include: 𝗣𝗲𝗿𝗳𝗼𝗿𝗺𝗮𝗻𝗰𝗲 𝗧𝗲𝘀𝘁𝗶𝗻𝗴 :- 𝐋𝐨𝐚𝐝 𝐓𝐞𝐬𝐭𝐢𝐧𝐠: Checks the application's behavior under expected load. 𝐒𝐭𝐫𝐞𝐬𝐬 𝐓𝐞𝐬𝐭𝐢𝐧𝐠:Tests the application's stability under extreme conditions. 𝐒𝐜𝐚𝐥𝐚𝐛𝐢𝐥𝐢𝐭𝐲 𝐓𝐞𝐬𝐭𝐢𝐧𝐠: Assesses the application's ability to scale up. 𝐒𝐭𝐚𝐛𝐢𝐥𝐢𝐭𝐲 𝐓𝐞𝐬𝐭𝐢𝐧𝐠:Ensures consistent performance over time. 𝐂𝐨𝐦𝐩𝐚𝐭𝐢𝐛𝐢𝐥𝐢𝐭𝐲 𝐓𝐞𝐬𝐭𝐢𝐧𝐠: Verifies that the application works across various devices, platforms, or operating systems. 𝗪𝗵𝘆 𝗦𝗼𝗳𝘁𝘄𝗮𝗿𝗲 𝗧𝗲𝘀𝘁𝗶𝗻𝗴 𝗠𝗮𝘁𝘁𝗲𝗿𝘀 Testing ensures a bug-free, reliable, and high-performing application. By combining manual and automated approaches with functional and non-functional testing techniques, developers can deliver a robust product that meets both user expectations and business requirements. Understanding these testing types helps teams choose the right strategy to achieve software excellence!

  • View profile for Saanya Ojha
    Saanya Ojha Saanya Ojha is an Influencer

    Partner at Bain Capital Ventures

    77,362 followers

    At some point in the past 18 months, it became trendy to say that software engineering was dead. Why learn to code when you can tell an LLM, “make me an app with a login screen and a database” and out pops code? Voilà. Startup in a weekend. Series A by Thursday. Thus was born vibe coding - the art of building software by manifesting it. Mix 1 part natural language, 1 part vague ambition, and 1 part blind confidence as you paste mystery code into production. For a brief, shimmering moment, it almost felt like the future. Until it didn’t. AI code assistants unlocked a wave of creative energy. Non-technical founders spun up MVPs. Engineers offloaded boilerplate. Students built full apps in a weekend. But prototype-grade code isn’t production-grade code. Many teams that began with LLM scaffolds are now spending weeks refactoring. Some have even declared “code bankruptcy.” Because there’s a difference between writing code and building software. The former is syntax. The latter is systems thinking. At some point, every serious technical team has the same realization: you don’t just need code - you need engineering. Vibe coding isn’t a tech failure, it’s a categorization error. It assumes that the problem in software development is generation speed. But for any company past the napkin stage, that’s not the bottleneck. It is: - Understanding and reflecting business logic - Architecting clean, extensible code - Managing state, latency, auth, concurrency, observability - Reasoning through edge cases and failure modes LLMs don’t reason through trade-offs or hold long-term context. They don’t ask, “Why does this route even exist?” So when teams use LLMs to generate full features - or worse, entire codebases - they end up with systems that appear functional but are structurally hollow. Like a house with beautiful wallpaper but no load-bearing walls. There’s a market for vibe-coding. It’s just not software. This is the real distinction: vibe coding and AI in software development are not the same thing. - Vibe coding tries to replace engineering. Hand the keys to the model, hope for the best. - AI in software development amplifies engineering. Accelerate rote work while owning architecture, logic, and trade-offs. The first treats AI as a substitute; the second treats it as a lever. Vibe coding is fantastic 0 → 1. It’s a liability 1 → 100. It’s like bringing a balloon animal to a knife fight. Wonderful at a birthday party. Less helpful in real combat. There’s a real market for fast, disposable, front-of-the-house code. But most tech companies are in the business of building the kitchen, not just plating food. The panic about “engineering being dead” comes from people who don't understand it. Engineering isn’t syntax. It’s constraint management, abstraction design, knowing when to optimize and when to punt. Ironically, as AI makes building easier, the value of engineering judgment goes up. The faster you can go, the more you need someone to steer.

  • View profile for Nikki Siapno

    Eng Manager | ex-Canva | 400k+ audience | Helping you become a great engineer and leader

    213,975 followers

    SOLID principles are key in object-oriented programming. But what does each principle actually mean, and why are they significant? 𝗦𝗢𝗟𝗜𝗗 𝗿𝗲𝗽𝗿𝗲𝘀𝗲𝗻𝘁𝘀 𝗳𝗶𝘃𝗲 𝗽𝗿𝗶𝗻𝗰𝗶𝗽𝗹𝗲𝘀 𝗼𝗳 𝗼𝗯𝗷𝗲𝗰𝘁-𝗼𝗿𝗶𝗲𝗻𝘁𝗲𝗱 𝗽𝗿𝗼𝗴𝗿𝗮𝗺𝗺𝗶𝗻𝗴. Whether or not you use OOP, 𝗸𝗻𝗼𝘄𝗶𝗻𝗴 𝘁𝗵𝗲𝘀𝗲 𝗽𝗿𝗶𝗻𝗰𝗶𝗽𝗹𝗲𝘀 𝗴𝗶𝘃𝗲𝘀 𝘆𝗼𝘂 𝗮 𝗹𝗲𝗻𝘀 𝗶𝗻𝘁𝗼 𝘁𝗵𝗲 𝗳𝗼𝘂𝗻𝗱𝗮𝘁𝗶𝗼𝗻𝘀 𝗼𝗳 𝗰𝗹𝗲𝗮𝗻 𝗰𝗼𝗱𝗲 which can be applied to many areas of programming. 𝗦 — Single Responsibility Principle 𝗢 — Open/Closed Principle 𝗟 — Liskov Substitution Principle 𝗜 — Interface Segregation Principle 𝗗 — Dependency Inversion Principle Let’s break down each principle ↓ 𝟭. 𝗦𝗶𝗻𝗴𝗹𝗲 𝗥𝗲𝘀𝗽𝗼𝗻𝘀𝗶𝗯𝗶𝗹𝗶𝘁𝘆 𝗣𝗿𝗶𝗻𝗰𝗶𝗽𝗹𝗲 (𝗦𝗥𝗣) Each unit of code should only have one job or responsibility. A unit can be a class, module, function, or component. This keeps code modular and removes the risk of tight coupling. 𝟮. 𝗢𝗽𝗲𝗻-𝗖𝗹𝗼𝘀𝗲𝗱 𝗣𝗿𝗶𝗻𝗰𝗶𝗽𝗹𝗲 (𝗢𝗖𝗣) Units of code should be open for extension but closed for modification. You should be able to extend functionality with additional code rather than modifying existing ones. This principle can be applied to component-based systems such as a React frontend. 𝟯. 𝗟𝗶𝘀𝗸𝗼𝘃 𝗦𝘂𝗯𝘀𝘁𝗶𝘁𝘂𝘁𝗶𝗼𝗻 𝗣𝗿𝗶𝗻𝗰𝗶𝗽𝗹𝗲 (𝗟𝗦𝗣) You should be able to substitute a subclass with its base class. In other words, all functionality in the base class should be utilized by all of its subclasses. If it can’t, it shouldn’t be in the base class. An example of this is with a Bird base class. You might assume that it should have a fly method. But what about the birds that can’t fly? Like a Penguin. In this example, fly should not be in the base class as it does not apply to all subclasses. 𝟰. 𝗜𝗻𝘁𝗲𝗿𝗳𝗮𝗰𝗲 𝗦𝗲𝗴𝗿𝗲𝗴𝗮𝘁𝗶𝗼𝗻 𝗣𝗿𝗶𝗻𝗰𝗶𝗽𝗹𝗲 (𝗜𝗦𝗣) Provide multiple interfaces with specific responsibilities rather than a small set of general-purpose interfaces. Clients shouldn’t need to know about the methods & properties that don't relate to their use case. Complexity ↓ Code flexibility ↑ 𝟱. 𝗗𝗲𝗽𝗲𝗻𝗱𝗲𝗻𝗰𝘆 𝗜𝗻𝘃𝗲𝗿𝘀𝗶𝗼𝗻 𝗣𝗿𝗶𝗻𝗰𝗶𝗽𝗹𝗲 (𝗗𝗜𝗣) You should depend on abstractions, not on concrete classes. Use abstractions to decouple dependencies between different parts of the systems. Direct calls between units of code shouldn’t be done, instead interfaces or abstractions should be used. —— Want more engineering insights like this? Subscribe to our 𝗳𝗿𝗲𝗲 𝗻𝗲𝘄𝘀𝗹𝗲𝘁𝘁𝗲𝗿 for a 𝘄𝗲𝗲𝗸𝗹𝘆 𝗱𝗲𝗲𝗽-𝗱𝗶𝘃𝗲 and roundup of our best content: blog.levelupcoding.co #softwareengineering #webdevelopment #programming

  • View profile for Raj Vikramaditya

    Building takeUforward(1M+ Users) | Ex - Google, Media.net, Amazon | YouTuber(900K+) | JGEC

    908,947 followers

    Yesterday, a reel flooded my DMs, featuring someone boasting about a fabricated production issue as if it were a badge of honor. For any college student or aspiring developer reading this, here’s a glimpse of how a typical production release works in a large organization like Amazon, especially for a customer-facing feature: - Feature Flags: Any new feature or change you push is almost always behind a feature flag. If the flag is enabled, the new code executes; otherwise, it defaults to the existing behavior. - Bug Bash: The team conducts a rigorous bug bash to identify and fix any glaring issues. - Quality Assurance (QA): Dedicated QA engineers test the feature across all critical user journeys, ensuring stability and functionality. - Gradual Rollout: The production rollout is phased: • Initially, only 1% of users experience the feature. • If no critical bugs are reported, the rollout progresses to a higher percentage (e.g., 10%, then 50%, and finally 100%). • In some organizations, this process involves releasing to alpha, beta, and general users, which follows the same principle. - Logs and Deployment Tracking: Every change or deployment is logged. This eliminates any ambiguity—no one needs to call or ask if a deployment occurred. A simple search in the deployment history provides all the details. - On-Call and Incident Management: In the event of an issue, on-call developers are the first to respond. If the new feature is causing the problem, they can disable the feature flag, instantly rolling back to the previous stable state. Key Takeaway: A proper production release is a systematic, collaborative, and well-monitored process. It’s not a playground for recklessness or boasting about mishandled issues. Be proud of delivering quality, not chaos. Keep learning, stay humble, and remember—the goal is to solve real problems, not create them. #striver #engineering

  • View profile for Milan Jovanović
    Milan Jovanović Milan Jovanović is an Influencer

    Practical .NET and Software Architecture Tips | Microsoft MVP

    272,181 followers

    What are the SOLID principles? 🤔 As a .NET developer, I'm always looking for ways to improve the quality and maintainability of my code. I want to share my experiences using the SOLID principles and how they've helped me create better code. First, let's define what we mean by SOLID. The acronym 𝗦𝗢𝗟𝗜𝗗 stands for: - Single responsibility principle - Open/closed principle - Liskov substitution principle - Interface segregation principle - Dependency inversion principle Let's break them down. 🔬 1. 𝗦𝗶𝗻𝗴𝗹𝗲 𝗥𝗲𝘀𝗽𝗼𝗻𝘀𝗶𝗯𝗶𝗹𝗶𝘁𝘆 𝗣𝗿𝗶𝗻𝗰𝗶𝗽𝗹𝗲 (𝗦𝗥𝗣) A class should have only one reason to change. In other words, a class should have a single, well-defined responsibility. That class should entirely encapsulate responsibility. 2. 𝗢𝗽𝗲𝗻/𝗖𝗹𝗼𝘀𝗲𝗱 𝗣𝗿𝗶𝗻𝗰𝗶𝗽𝗹𝗲 (𝗢𝗖𝗣) Software entities (classes, functions, etc.) should be open for extension but closed for modification. You should be able to add new functionality to a class without changing its existing code, but you should not need to modify the class itself to do so. 3. 𝗟𝗶𝘀𝗸𝗼𝘃 𝗦𝘂𝗯𝘀𝘁𝗶𝘁𝘂𝘁𝗶𝗼𝗻 𝗣𝗿𝗶𝗻𝗰𝗶𝗽𝗹𝗲 (𝗟𝗦𝗣) Subtypes must be substitutable for their base types. In other words, if a class is derived from another class, you should be able to use the derived class in the same way as the base class without any issues. 4. 𝗜𝗻𝘁𝗲𝗿𝗳𝗮𝗰𝗲 𝗦𝗲𝗴𝗿𝗲𝗴𝗮𝘁𝗶𝗼𝗻 𝗣𝗿𝗶𝗻𝗰𝗶𝗽𝗹𝗲 (𝗜𝗦𝗣) Clients should not depend on interfaces they do not use. This means you should design your interfaces as specific and focused as possible. 5. 𝗗𝗲𝗽𝗲𝗻𝗱𝗲𝗻𝗰𝘆 𝗜𝗻𝘃𝗲𝗿𝘀𝗶𝗼𝗻 𝗣𝗿𝗶𝗻𝗰𝗶𝗽𝗹𝗲 (𝗗𝗜𝗣) High-level modules should not depend on low-level modules. Both should depend on abstractions. Design your software so high-level modules depend on abstractions rather than concrete implementations. I struggled with creating code that was easy to understand and maintain, but the SOLID principles provided a clear set of guidelines to follow when designing software. One of the first principles I focused on was SRP. It encourages developers to design classes with a single, well-defined responsibility and to keep the code for that responsibility entirely encapsulated within the class. This makes it easier to understand a class's purpose and change its behavior without affecting other parts of the system. Imagine a class doing a few things, like performing calculations and interacting with the database. We could refactor the class to have a single responsibility of calculating the result and create separate classes for interacting with the database. This would make the code easier to understand and maintain. Hope that was helpful. :) P.S. If you enjoyed this post, repost it ♻️ to share it with your audience.

  • View profile for Arpit Bhayani
    Arpit Bhayani Arpit Bhayani is an Influencer
    270,191 followers

    Abstraction is a fundamental principle in software engineering, but premature abstraction does more harm than good ⚡ Premature abstraction occurs when we create generalized solutions before fully understanding the specific problems we're solving. For example, starting to write the first implementation in a completely abstract way without even needing to write the second one, ever. It's a trap to fall into, especially for those who take pride in writing "clean" and "elegant" code. They see patterns emerging in our early development stages and think, "Ahhh, I can abstract this into a reusable component!". But in most cases, you would never need to have the second implementation of the functionality. The problem isn't that abstraction is bad. The issue arises when we abstract too early. Such implementation would lead to leaky abstraction that fails to encapsulate the complexity it was meant to hide. Four key problems with premature abstraction 1. makes code harder to understand 2. adds layers of indirection that make the code harder to navigate 3. makes you not trust your own subsequent changes to the codebase 4. adding a generic handler requires accounting for all possible cases, leading to unnecessary checks and operations. It is important to resist the urge to abstract too early and here's what I do; I follow the principle of "Rule of Three" - the core idea is to wait until there are at least three concrete implementations before attempting to abstract. This ensures that I have abstracted the implementation only after having a deeper understanding of the commonalities and differences between various use cases. Here are the four things I stick to while building large applications, 1. implement solutions for specific use cases first 2. don't try to solve problems you don't have yet 3. look for patterns that emerge naturally 4. refactor your existing code incrementally Again, not saying to not use abstractions. They are great at hiding out complexities and making code extensible, but just nudging to create systems that can evolve and adapt over time rather than being overly complicated on day 0. Remember, the goal of abstraction is to manage complexity, not to showcase our ability to write clever code. #AsliEngineering #SoftwareEngineering #OOP

  • View profile for Julien Chaumond

    CTO at Hugging Face

    238,156 followers

    Code is the product. How do you prevent a 1M+ LoC Python library, built by thousands of contributors, from collapsing under its own weight? In transformers, we do it with a set of explicit software engineering tenets. With Pablo Montalvo, Lysandre Debut, Pedro Cuenca and Yoni Gozlan, we just published a deep dive on the principles that keep our codebase hackable at scale. What’s inside: – The Tenets We Enforce: From One Model, One File to Standardize, Don't Abstract, these are the rules that guide every PR. – "Modular Transformers": How we used visible inheritance to cut our effective maintenance surface by ~15× while keeping modeling code readable from top to bottom. – Pluggable Performance: A standard attention interface and config-driven tensor parallelism mean semantics stay in the model while speed (FlashAttention, community kernels, TP sharding) is a configurable add-on, not a code rewrite. This matters for anyone shipping models, contributing to OSS, or managing large-scale engineering projects. It’s how we ensure a contribution to transformers is immediately reusable across the ecosystem (vLLM, ggml, SGLang, etc.). Read more on the Hugging Face blog

Explore categories