"Vibe Coding !== Low Quality Work: a guide to responsible AI-assisted dev" ✍️ My latest free article: https://lnkd.in/gjMdjMWV The allure of "vibe coding" – using AI to "move faster and break even more things" – is strong. AI-assisted development is undeniably transformative, lowering barriers and boosting productivity. But speed without quality is a dangerous trap. Relying uncritically on AI-generated code can lead to brittle "house of cards" systems, amplify tech debt exponentially, and introduce subtle security flaws. Volume ≠ Quality. A helpful mental model I discuss (excellently illustrated by Forrest Brazeal) is treating AI like a "very eager junior developer." It needs guidance, review, and refinement from experienced hands. You wouldn't let a junior ship unreviewed code, right? So how do we harness AI's power responsibly? I've outlined a field guide with practical rules: ✅ Always review: Treat AI output like a PR from a new hire. ✅ Refactor & test: Inject engineering wisdom – clean up, handle edge cases, test thoroughly. ✅ Maintain standards: Ensure AI code meets your team's style, architecture, and quality bar. ✅ Human-led design: Use AI for implementation grunt work, not fundamental architecture decisions. The goal isn't to reject vibe coding, but to integrate it with discipline. Let's use AI to augment our craft, pairing machine speed with human judgment. #softwareengineering #programming #ai
Best Programming Practices for Clean Code
Explore top LinkedIn content from expert professionals.
-
-
Master the core SQL commands that drive 80% of tasks. This post focuses on practical, real-world applications of SQL for maximum impact. Fundamental SQL Commands 1. 𝗦𝗘𝗟𝗘𝗖𝗧: Retrieving specific data 𝚂𝙴𝙻𝙴𝙲𝚃 𝚏𝚒𝚛𝚜𝚝_𝚗𝚊𝚖𝚎, 𝚕𝚊𝚜𝚝_𝚗𝚊𝚖𝚎, 𝚎𝚖𝚊𝚒𝚕 𝙵𝚁𝙾𝙼 𝚌𝚞𝚜𝚝𝚘𝚖𝚎𝚛𝚜; 2. 𝗪𝗛𝗘𝗥𝗘: Filtering results 𝚆𝙷𝙴𝚁𝙴 𝚙𝚞𝚛𝚌𝚑𝚊𝚜𝚎_𝚍𝚊𝚝𝚎 >= '𝟸𝟶𝟸𝟹-𝟶𝟷-𝟶𝟷' 𝙰𝙽𝙳 𝚝𝚘𝚝𝚊𝚕_𝚜𝚙𝚎𝚗𝚝 > 𝟷𝟶𝟶𝟶; 3. 𝗚𝗥𝗢𝗨𝗣 𝗕𝗬: Aggregating data 𝚂𝙴𝙻𝙴𝙲𝚃 𝚙𝚛𝚘𝚍𝚞𝚌𝚝_𝚌𝚊𝚝𝚎𝚐𝚘𝚛𝚢, 𝚂𝚄𝙼(𝚜𝚊𝚕𝚎𝚜_𝚊𝚖𝚘𝚞𝚗𝚝) 𝙰𝚂 𝚝𝚘𝚝𝚊𝚕_𝚜𝚊𝚕𝚎𝚜 𝙵𝚁𝙾𝙼 𝚜𝚊𝚕𝚎𝚜 𝙶𝚁𝙾𝚄𝙿 𝙱𝚈 𝚙𝚛𝚘𝚍𝚞𝚌𝚝_𝚌𝚊𝚝𝚎𝚐𝚘𝚛𝚢; 4. 𝗢𝗥𝗗𝗘𝗥 𝗕𝗬: Sorting data 𝚂𝙴𝙻𝙴𝙲𝚃 𝚙𝚛𝚘𝚍𝚞𝚌𝚝_𝚗𝚊𝚖𝚎, 𝚜𝚝𝚘𝚌𝚔_𝚚𝚞𝚊𝚗𝚝𝚒𝚝𝚢 𝙵𝚁𝙾𝙼 𝚒𝚗𝚟𝚎𝚗𝚝𝚘𝚛𝚢 𝙾𝚁𝙳𝙴𝚁 𝙱𝚈 𝚜𝚝𝚘𝚌𝚔_𝚚𝚞𝚊𝚗𝚝𝚒𝚝𝚢 𝙰𝚂𝙲; 5. 𝗝𝗢𝗜𝗡: Combining related data 𝚂𝙴𝙻𝙴𝙲𝚃 𝚘.𝚘𝚛𝚍𝚎𝚛_𝚒𝚍, 𝚌.𝚌𝚞𝚜𝚝𝚘𝚖𝚎𝚛_𝚗𝚊𝚖𝚎, 𝚘.𝚘𝚛𝚍𝚎𝚛_𝚍𝚊𝚝𝚎 𝙵𝚁𝙾𝙼 𝚘𝚛𝚍𝚎𝚛𝚜 𝚘 𝙸𝙽𝙽𝙴𝚁 𝙹𝙾𝙸𝙽 𝚌𝚞𝚜𝚝𝚘𝚖𝚎𝚛𝚜 𝚌 𝙾𝙽 𝚘.𝚌𝚞𝚜𝚝𝚘𝚖𝚎𝚛_𝚒𝚍 = 𝚌.𝚒𝚍; Advanced SQL Techniques 1. 𝗦𝘂𝗯𝗾𝘂𝗲𝗿𝗶𝗲𝘀: Nested queries for complex conditions SELECT product_name, price FROM products WHERE price > (SELECT AVG(price) FROM products); 2. 𝗖𝗼𝗺𝗺𝗼𝗻 𝗧𝗮𝗯𝗹𝗲 𝗘𝘅𝗽𝗿𝗲𝘀𝘀𝗶𝗼𝗻𝘀 (𝗖𝗧𝗘): Simplifying complex queries WITH monthly_sales AS ( SELECT EXTRACT(MONTH FROM sale_date) AS month, SUM(amount) AS total FROM sales GROUP BY EXTRACT(MONTH FROM sale_date) ) SELECT month, total FROM monthly_sales WHERE total > 100000; 3. 𝗪𝗶𝗻𝗱𝗼𝘄 𝗙𝘂𝗻𝗰𝘁𝗶𝗼𝗻𝘀: Calculations across row sets SELECT department, employee_name, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS salary_rank FROM employees; 4. 𝗖𝗔𝗦𝗘 𝗦𝘁𝗮𝘁𝗲𝗺𝗲𝗻𝘁𝘀: Conditional categorization SELECT customer_id, CASE WHEN lifetime_value > 10000 THEN 'VIP' WHEN lifetime_value > 5000 THEN 'Premium' ELSE 'Standard' END AS customer_segment FROM customer_data; Optimization Tips - Use indexes on frequently filtered columns - Avoid SELECT * and only retrieve necessary columns - Use EXPLAIN ANALYZE to understand query execution plans Learning Strategy 1. Start with simple SELECT queries on a sample database 2. Progress to filtering and sorting data 3. Practice joins with multiple tables 4. Explore advanced techniques with real datasets 5. Participate in online SQL challenges and forums By mastering these SQL commands and techniques, you'll be well-equipped to handle a wide range of data analysis tasks efficiently. Regular practice with diverse datasets will solidify your skills. What's your favorite SQL trick for streamlining data ? Share your insights below!
-
AI security/securing the use of AI is going to kill me. I use Claude Code almost daily. It's a problem.... Here's what I have to change AGAIN this week. Security researcher Ari Marzuk disclosed 30+ vulnerabilities across AI coding tools. Cursor. GitHub Copilot. Windsurf. Claude Code. All of them. He called it IDEsaster. The attack chain includes prompt injection, hijacking LLM context, and auto-approved tool calls executing without permission. Then, legitimate IDE features are weaponized for data exfiltration and RCE. Your .env files. Your API keys. Your source code. Accessible through features you thought were safe. Most studies I read claim that around 85% of developers now use AI coding tools daily. Most have no idea their IDE treats its own features as inherently trusted. 𝗦𝗼... 𝗮𝗳𝘁𝗲𝗿 𝗿𝗲𝘃𝗶𝗲𝘄𝗶𝗻𝗴 𝗔𝗿𝗶'𝘀 𝗿𝗲𝘀𝗲𝗮𝗿𝗰𝗵, 𝗵𝗲𝗿𝗲'𝘀 𝗜 𝘄𝗶𝗹𝗹 𝗯𝗲 𝗱𝗼𝗶𝗻𝗴... Be warned: All this is SO much easier said than done! Audit every MCP server connection. Checked for tool poisoning vectors where legitimate tools might parse attacker-controlled input from GitHub PRs or web content. Removed servers I couldn't verify. Disabled auto-approve for file writes. The attack chains weaponize configuration files and project instructions like .claude/settings.json and CLAUDE.md. One malicious write to these files can alter agent behavior or achieve code execution without additional user interaction. Move all credentials to a secrets manager. No .gitignored .env files in agent-accessible directories. API keys live in 1Password CLI. Environment variables inject at runtime through a wrapper script the LLM never sees. Start running Claude Code in isolated containers. Mounted volumes limited to specific project directories. No access to ~/.ssh, ~/.aws, or ~/.config. If the agent gets compromised, blast radius stays contained. Enable all security warnings. Claude Code added explicit warnings for JSON schema exfiltration and settings file modifications. These exist because Anthropic knows the attack surface. Add pre-commit hooks for hidden characters. Prompt injections hide in pasted URLs, READMEs, and file names using invisible Unicode. Flag non-ASCII characters in any file the agent might ingest. The fix isn't to stop using AI coding tools. The fix is to stop trusting them implicitly. What controls do you have for AI tools with write access to your codebase? 👉 Follow for more AI and cybersecurity insights with the occasional rant #AISecurity #DevSecOps
-
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
-
𝗧𝗵𝗲 𝗩𝗶𝗯𝗲 𝗖𝗼𝗱𝗶𝗻𝗴 𝗟𝗶𝗲. “I built an app in 3 hours.” Sure. You built a demo. It will take you at least 3 weeks to make it production-ready. And 3 months to clean up the mess. Vibe coding is fun until you have to ship something real. LLMs make development feel effortless. A polished UI with a a hosted backend. Everything responds instantly. Anyone who can write a prompt can spin up something that looks like a product. But the hard part was never building fast. The hard part is building to last. You would not build a house without a foundation. Yet that is exactly what vibe coding encourages. 𝗬𝗼𝘂𝗿 𝗽𝗿𝗼𝗱𝘂𝗰𝘁 𝗯𝗿𝗲𝗮𝗸𝘀 𝘁𝗵𝗲 𝗺𝗼𝗺𝗲𝗻𝘁 𝘆𝗼𝘂 𝘀𝗸𝗶𝗽 𝘁𝗵𝗲 𝗳𝘂𝗻𝗱𝗮𝗺𝗲𝗻𝘁𝗮𝗹𝘀: → Infrastructure design → Security boundaries → Deployment strategy → Error handling → Logging for diagnosis → Monitoring for failure detection → Alerts when things break at 2 a.m. AI-assisted development is genuinely powerful. I have seen delivery timelines compress from weeks to days. Prototyping and early validation have never been faster. I use it myself, and I enjoy it. But here is the uncomfortable truth: AI optimizes for plausibility. Not for simplicity and also not for long-term correctness. Left unconstrained, it produces architectures and technical debt that look reasonable but age badly: → Abstraction layers nobody can explain → Blurred component boundaries → “Best practices” added before there is a problem to solve More code. Lower quality. Slower teams over time. Vibe coding optimizes for speed as the primary metric. Engineer-guided AI treats software as long-lived infrastructure that must be operated, understood, and evolved. AI does not reduce the need for engineering judgment. It increases it. The engineer’s role is shifting: From writing code to constraining, reviewing, and shaping it. AI is an accelerator. Without direction, it accelerates technical debt just as efficiently as it accelerates delivery. ↓ 𝗜’𝗺 𝘀𝗵𝗮𝗿𝗶𝗻𝗴 𝗮 𝗳𝘂𝗹𝗹 𝗯𝗿𝗲𝗮𝗸𝗱𝗼𝘄𝗻 𝗼𝗳 𝘁𝗵𝗲 𝘀𝘁𝗮𝗰𝗸 𝗯𝗲𝗵𝗶𝗻𝗱 𝘃𝗶𝗯𝗲 𝗰𝗼𝗱𝗶𝗻𝗴 𝗮𝗻𝗱 𝗮𝗴𝗲𝗻𝘁𝗶𝗰 𝗲𝗻𝗴𝗶𝗻𝗲𝗲𝗿𝗶𝗻𝗴 𝘁𝗼𝗻𝗶𝗴𝗵𝘁 - 𝘀𝘂𝗯𝘀𝗰𝗿𝗶𝗯𝗲 𝗵𝗲𝗿𝗲 𝘁𝗼 𝗿𝗲𝗰𝗲𝗶𝘃𝗲 𝗶𝘁: https://lnkd.in/dbf74Y9E
-
STOP deploying Notebooks to Production! This folder structure is much better: /𝗰𝗼𝗻𝗳𝗶𝗴 🔹Centralized config for DBs, APIs, and environments 🔹Change connections without touching code /𝗱𝗮𝘁𝗮 🔹Raw and processed datasets for local work 🔹Keeps experiments and pipelines using the same inputs /𝗱𝗼𝗰𝘀 🔹Living documentation for setup and architecture 🔹New teammates ramp up without asking questions /𝗲𝘁𝗹 🔹Clear extract/, transform/, load/ stages 🔹Each step testable and replaceable on its own /𝗽𝗶𝗽𝗲𝗹𝗶𝗻𝗲𝘀 🔹High‑level runs that orchestrate ETL pieces 🔹One place to see “what runs when and how” /𝘀𝗿𝗰 🔹Shared logic, utilities, and validation in one module 🔹No more copy‑pasting helpers across scripts /𝘁𝗲𝘀𝘁𝘀 🔹Unit and integration tests for critical paths 🔹Catch broken pipelines before they hit production /.𝗴𝗶𝘁𝗶𝗴𝗻𝗼𝗿𝗲, 𝗲𝗻𝘃𝗶𝗿𝗼𝗻𝗺𝗲𝗻𝘁.𝘆𝗺𝗹, 𝗥𝗘𝗔𝗗𝗠𝗘.𝗺𝗱 🔹Ignore junk and explain how to run everything Why this structure is so good: - Everything is where people expect it - Each stage has its own place and tests - Prototype into prod is mostly wiring, not rewriting - Swap sources/targets without rewriting the pipeline - No more random SQL hidden in random notebooks This serves as a base template. Then you can add: - Docker - Airflow - Terraform --- ♻️ Repost if you found it useful please! Follow 👉🏻José for more about Data Engineering
-
GROUP BY cuts rows down. Window functions let me analyze each one without losing any. That one trait is why they end up in every analytics codebase once I learn what they can do. Six rows go in. Six rows come out. Here are 7 big ones and what they do: 1. 𝗥𝗢𝗪_𝗡𝗨𝗠𝗕𝗘𝗥 → number the rows in a group so you can keep the first and drop the rest. 2. 𝗥𝗔𝗡𝗞 → leaderboards. Ties share a rank, then the next value skips ahead. 3. 𝗡𝗧𝗜𝗟𝗘 → split rows into quartiles, deciles, or halves. 4. 𝗟𝗔𝗚 / 𝗟𝗘𝗔𝗗 → compare a row to the one behind or ahead of it. Month over month without a self join. 5. 𝗙𝗜𝗥𝗦𝗧_𝗩𝗔𝗟𝗨𝗘 → index every row back to where its group started. 6. 𝗥𝘂𝗻𝗻𝗶𝗻𝗴 𝘁𝗼𝘁𝗮𝗹 → SUM with ORDER BY. Cumulative revenue, one line of SQL. 7. 𝗣𝗮𝗿𝘁𝗶𝘁𝗶𝗼𝗻𝗲𝗱 𝘁𝗼𝘁𝗮𝗹 → SUM without ORDER BY. Every row gets its group total, which is how you calculate share of total. One thing to keep in mind. You cannot filter on a window function in the same WHERE clause, because WHERE runs first. Wrap it in a subquery, or use QUALIFY when the warehouse supports it. Once you understand that windows preserve rows, a lot of analytical SQL starts making more sense. PS - any functions you'd add here? ___ 💾 Save this for later ♻️ Repost for the homies
-
I've been using Clean Architecture for 6+ years. Here’s why I think it’s amazing. 👇 The biggest pain in enterprise systems? A lack of structure. Every project reinvents the wheel. Every team builds layers differently. And knowledge doesn’t transfer between systems. But there’s a proven way to fix this. It’s called Clean Architecture. It’s not about how many projects you create. It’s not about fancy patterns. ✅ It’s about the direction of dependencies. Inner layers (domain, app) define abstractions. Outer layers (infra, presentation) implement those abstractions. Never the other way around. That’s it. That’s the rule. You can package this as: - Layers (domain, app, infra, web) - Vertical slices (grouped per feature) - Components (layers + vertical slices) They all work — if you follow the rule. What are the benefits? - Modular code - Clear separation of concerns - Easy-to-test business logic - Faster onboarding - Loosely coupled components Clean Architecture has helped me ship excellent products. And I’ll keep using it because it works. Want to simplify your development process? Grab my free Clean Architecture template here: https://lnkd.in/eDgfyWKB
-
Low-level design patterns are great, but beyond a point, they make code unnecessarily complex, slow, hard to contribute to, hard to read, hard to debug, and borderline bad. Not every code needs to be extensible, because most code you write is never going to be extended. You created an abstract database DAO layer just in case you are required to move away from MySQL, but did you ever switch your database? This is where I follow the rule of 3 - if I need to repeat or write something at least 3 times, I adopt an appropriate pattern and abstract out the complexities; otherwise, it is a waste of time and effort. Because, if required, you can always buy some time and add the necessary abstractions when needed. Spend time shipping things faster and optimizing for time-to-market. Remember, business >> product >> engineering.
-
I've spent at least 60' every day for the last couple of months vibe coding on Claude Code... and most of the time I did it wrong! Defining the right anatomy of the .claude/ folder has defined a before and an after on the quality of my side projects. Most new users skip the setup. They open Claude Code and start prompting raw. No structure. No rules. No memory. That's the mistake I did. The .claude folder is Claude's operating system for your project. Get it right and Claude stops guessing. Get it wrong and you spend half your time correcting it. Here's the anatomy that works: 👉 CLAUDE.md → Claude's instruction manual. Build commands, architecture decisions, conventions, gotchas. Keep it under 200 lines. This is your highest-leverage file. 👉 rules/ → When CLAUDE.md gets crowded, split by concern. code-style.md, testing.md, api-conventions.md. Scope rules to specific paths with YAML frontmatter so they only load when relevant. 👉 commands/ → Repeatable workflows as slash commands. Code review, issue fixing, deploy checks. They run shell commands and inject real output into the prompt. 👉 skills/ → Like commands but Claude triggers them automatically when the task matches. They're packages, not single files. 👉 agents/ → Isolated subagent personas with their own tools and model preferences. A code reviewer that only reads. A security auditor scoped to grep. 👉 settings.json → Permission control. What Claude can run freely, what it must ask about, what's blocked entirely. The part most people miss: there are two .claude folders. One in your project (committed, shared with the team) and one at ~/.claude/ (personal, global across all repos). The .claude folder is infrastructure. Treat it like one. Full guide in the article below in the comments 👇 #ai #claude
Explore categories
- Hospitality & Tourism
- Productivity
- Finance
- Soft Skills & Emotional Intelligence
- Project Management
- Education
- Leadership
- Ecommerce
- User Experience
- Recruitment & HR
- Customer Experience
- Real Estate
- Marketing
- Sales
- Retail & Merchandising
- Science
- Supply Chain Management
- Future Of Work
- Consulting
- Writing
- Economics
- Artificial Intelligence
- Employee Experience
- Healthcare
- Workplace Trends
- Fundraising
- Networking
- Corporate Social Responsibility
- Negotiation
- Communication
- Engineering
- Career
- Business Strategy
- Change Management
- Organizational Culture
- Design
- Innovation
- Event Planning
- Training & Development