Structure your Git Repo
- Monorepo or Multiple repos
- Monorepo (ในหนังสือ Software Engineer @ Google แนะนำนะ-Allow teams working together on a system to go fastest.)
- จุดเด่น เพราะเป็น Single source of truth แก้ไขต่างๆ อยู่ใน commit เดียวกัน / เห็นภาพรวม เกิด แชร์ code และ reuse ไม่มีเส้นแบ่งระหว่างทีม
- จุดด้อย ต้องทำ Code Health ดีตลอด เพราะ ถ้าพลาดพังหมด
- Multiple repos
- จุดเด่น ทุกทีมสามารถแยกส่วนการจัดการได้เลย
- จุดด้อย หากมีการแก้ไข Lib ต้องมีการแจ้งคุย ดูผลกระทบ และรอการ Build รวมถึงเอาไป Reference ในแต่ละ repo
- Monorepo (ในหนังสือ Software Engineer @ Google แนะนำนะ-Allow teams working together on a system to go fastest.)
- Implement a change log - บอกการเปลี่ยนแปลงของ Code ในแต่ละ release มีหลายแบบ
- Manual - เขียนกันเอง ลง Blog / Wiki
- Automate - git log และ gitchangelog มันดูจาก Commit ต้องเขียนให้สื่อ
- Knowledge Check: Structure your Git Repo
Manage Git branches and workflows
- Explore branch workflow types - Common branch / Trunk-based development / Forking workflow
- Explore feature branch workflow &
- feature branch Code ที่กำลังพัฒนาออกจากเส้นหลัก main branch ที่ใช้เก็บ Code ที่ใช้งานบน Production
- Trunk-based development (เค้า Recommend อันนี้เลย)
- Explore Git branch model for continuous delivery Branch ต่างๆ
- main branch - Code ที่ใช้งานบน Production (ready-to-release state)
- feature branch - กำลังพัฒนาออกจากเส้นหลัก แตก Branch สั้นๆ ทำ Feature และ ควรกำหนด feature flags เปิด/ปิด การทำงาน ส่วน Pattern การตั้งชื่อประมาณนี้
bugfix/description
features/feature-name
features/feature-area/feature-name
hotfix/description
users/username/description - Pull Request เพื่อให้เกิดการ review code ก่อนเข้า Main Branch
- Explore GitHub flow & fork workflow
- fork - gives every developer a server-side repository //เป็นการ Clone แหละ แต่ Server ทำให้
- พอแก้ Code เสร็จค่อย Pull Request กลับไป
- Lab3: Version control with Git in Azure repos
- Knowledge Check: Manage Git branches and workflows
Collaborate with pull requests in Azure Repos
- Merge Strategies
- Merge - เอา Log ของ Branch ที่ กำลังจะ Merge เข้ามาต่อใน Branch หลัก
- Squash Merge - ยุบ Merge Log ของ Branch ที่ กำลังจะ Merge ให้เหลือเพียง one commit for each merged branch
- Cherry Pick - ตัด Code จาก Commit ที่สนใจมาใส่ Branch ปลายทางจะใช้ในเคสมี Branch release ของลูกค้า A แล้วปรากฏว่า branch ของลูกค้าอื่นๆมี Bug นี้ที่ต้องไปแก้ด้วย
- 3-way merge - version control - Why is a 3-way merge advantageous over a 2-way merge? - Stack Overflow
- Pull Requests
- everyone shares a single repository, and topic branches are used to develop features and isolate changes.
- Then code reviewed > great feedback
Note: branches ไหนที่สำคัญให้กำหนด Policy ขึ้นมา branches policies เช่น pull requests + Guideline
- Azure DevOps - Branch policies
- จำนวน Reviewer - ถ้ามีปัญหาว่าใครจะ Review มี Automatically included reviewers มากำหนด Policy ให้
- Link กับ Work Item หรือยัง จะตรวจสอบได้ว่าที่ส่ง Merge มา มาจาก Task ไหน
- code review comments
- ดูรูปแบบการ Merge เข้ามา
- Azure DevOps - Build Validation - ตรวจสอบว่า Build ผ่านก่อน และ Status Checks - Deploy แล้วไม่พัง
- Knowledge Check: Collaborate with pull requests in Azure Repos
Identify technical debt
- เน้นส่วนของ Code Review ตอนทำ Pull Request และ
- Code Quality -
- Reliability - probability that a system will run without failure วัดจาก mean time between failures (MTBF)
- Maintainability
- Testability - size and complexity (วัดจาก cyclomatic complexity) of the software can impact testability //Refactor Code ให้เขียนง่ายจะดีที่สุด
- Portability - Same SWใน Enviroment ต่างกันทำงานได้เหมือนกัน อาจจะใช้ coding standard (ส่วนตัวมองว่ามันช่วยได้หลายมุมเลย)
- Reusability - พยายามทำให้ Code มัน modularity / loose coupling characteristics.
- Code Quality metrics - ถ้า Common เช่น
- Failed builds percentage - Overall, what percentage of builds are failing?
- Bug bounce percentage - What percentage of customer or bug tickets are reopened?
- Technical Debt - หนี้ทางเทคนิค เราเขียน Code ที่ไม่ตรงตาม Standard แล้ว ตอนแรกอาจจะใช้เวลา Fixed 1-2 ชั่วโมง แต่ถ้าปล่อยไปนานๆ อาจจะใช้เวลานานมากกว่านั้น
- Handle: Technical Debt
- Human Code Review
- Automate Tools เช่น SonarCube + SonarCloud / NDepend / Resharper Code Quality Analysis / WhiteSource Bolt (finding and fix open-source vulnerabilities.)
- Coding Standard + Improve Skill (เช่น knowledge-sharing เพื่อให้ Dev over-protective of their code)
- คหสต คนที่ทำ Technical Debt มักไม่ได้กลับมาแก้เอง ส่วนมากไม่อยู่และ
- Handle: Technical Debt
- Knowledge Check: Identify technical debt
Explore Git hooks
- Git Hooks = กลุ่มคำสั่งที่ Git จะเรียก ก่อนหรือหลัง event ใด เช่น commit, push เป็นต้น
- Practical use cases - notification / check pre-condition ก่อน merge (เช่น ตรวจว่าไม่มี hardcode secret ลงไปใน Code) / ตรวจ Lint เป็นต้น
- Implement Git hooks - น่าสนใจ เอามาลองกับ GitLab
- นอกจากฝั่ง Client ตัว Azure Repos มี hook ฝั่ง server ด้วย
- Knowledge Check: Explore Git hooks
Plan foster inner source
- Inner source = "internal open source" open-source software development inside your firewall
- ลด Silo ลงทุกคนมีโอกาสได้เห็น Code หมด เช่น ทีม Visual Studio คิดว่าบั๊กมันเกิดจาก Windows ก็ไป Fork Code แก้ แล้ว Pull Request (PR) กลับไปให้ทีม Windows Review และ Merge เข้า
- The forking workflow (ถ้า Dev ที่ทำงานร่วมกันน้อย 2-5 คน อาจจะไม่จำเป็นต้องใช้ Flow Fork
- Create a fork.
- Clone it locally.
- Make your changes locally and push them to a branch.
- Create and complete a PR to upstream.
- Sync your fork to the latest from upstream.
- Azure DevOps จะมี Flow นี้อยู่นะตามรูปเลย
- Knowledge Check: Plan foster inner source
Manage Git repositories
- Work with large repositories
- large repositories มาจาก Long history / Large binary files
- Workaround โดยใช้ Shallow clone
git clone --depth [depth] [clone-url]
- Azure มี Tools VFS for Git / Scalar มาจัดการไฟล์ใหญ่
- Purge repository data
- git filter-repo tool - rewriting history
- BFG Repo-Cleaner - deleting or "fixing" content in repositories
- Manage releases with GitHub Repo - ดูจาก tags + commit มาสร้าง
- Automate release notes with GitHub
- Knowledge Check: Manage Git repositories
Reference
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.