Comments by "Daniel Sandberg" (@ddanielsandberg) on "ThePrimeTime" channel.

  1. 108
  2. 19
  3. 17
  4. 14
  5. 11
  6. Velocity is a measurement, not a target nor a promise. So how can your "velocity be off"? The point is to tell you some kind of real rate, not the wished, hoped or estimated rate. That there are other things taking time, unpredictable things, is normal but should be managed to not overburden. Of course if you've been doing 5x more support than expected it may mean that the way you are working (development practices, testing, documentation, refactoring, monitoring, logging, planning, etc) need to change so that you don't drown in support. Something about a self-inflicted wound. I find the argument about mixing dev + test time as very odd. Untested, unfinished, undeployable features are worth nothing. There's no separate point-system for devs and testers. It's either done or not. I loathe developers that declared "I'm done", throws it to a tester and starts working on the next thing, and it doesn't even work. If you have a culture where there is a blame game of "you didn't meet your commitment" or "who estimated wrong" the organisation have not understood anything and you should either change your organization or change your organization. Tip: Remove the columns "ready for test" and "in test" from your board and only have todo, doing, done. If it's not tested it's not done and NO ONE gets any points, gold stars or pats on the back until it's actually done! The point of agile is not about processes, story points, burn-up, burn-down, sprints, etc, stuff. It's about giving everybody a healthy dose of reality so that the team and organization can adapt and change early, instead of hope that whatever "wishful plan" people have made will actually happen.
    7
  7. 5
  8. 5
  9. 4
  10. 4
  11. 3
  12. 3
  13. 2
  14. 2
  15. 2
  16. 2
  17. 2
  18. 2
  19. 2
  20. 2
  21. 2
  22. 2
  23. 2
  24. 2
  25. 2
  26. 2
  27. 1
  28. 1
  29. 1
  30. 1
  31. 1
  32. 1
  33. 1
  34. 1
  35. 1
  36. 1
  37. 1
  38. 1
  39. 1
  40. 1
  41. 1
  42. 1
  43. 1
  44. 1
  45. 1
  46. 1
  47. 1
  48. 1
  49. 1
  50. Don't enable the unfinished features using feature flags! All other changes in the code shall work, which is why automated testing is important. We do this all the time in Java/Kotlin/Go and it works just fine. Perfect when rewriting a component; just a flag if it shall use old or new implementation and flow. If the new implementation/feature doesn't work - just disable it. Need an emergency fix? Just make it and deploy! It's always deployable, even with unfinished features committed. In CI/CD the emergency hotfix process is exactly the same as any other change (except that we may skip days of performance testing). I can ask a question back: What if you have a bunch of features in the development branch. There is a deadline, but 3 out of 10 features that are merged are not in a releasable state due to finding bugs late? What do you do? 1. Revert a bunch of merge-commits at the last minute and have to re-test everything overnight? - Which may cause breakages in other code that had to be modified/refactored due to changes made to accommodate these 3 features. - Leading to people becoming afraid of refactoring and then process is added so that everyone has to ask for permission, time and budget to refactor. - Leading to increase in tech debt, stress and whatnot. 2. Taking cherry-picked commits from dev to master? And ending up with a master with a combination of commits that has never been tested together? - Even harder with the anti-pattern of doing squash merges from feature branches. - And all the other problems from (1). 3. Making another "release branch" and cherry-pick so that it at least can be tested in isolation. - But now ending up with yet another "truth" of the system? Have fun merging back and forth like it's 1997. All of this just creates complexity. The organization ends up hiring release managers, starts doing a lot of planning, processes, gatekeeping, Gantt charts, inter-team dependency management, etc. CI and TBD removes 90% of the problems. But it requires engineering beyond implementing the task and moving on to the next.
    1
  51.  @YPLabs  Some things are harder than others. If it is changing an existing page, try do it by making many small changes. And if there are some elements that should not be visible yet, use a flag (templates and SSR components are full of conditions anyway). If it is new/replacement UI then duplicate the pages and rewrite them, have a router based on some criteria of which one to use. Sometimes we end up in trouble when switching from framework v1 to v2 and we get conflicts. There are ways around that too. It may be so that in that case the team makes the choice to actually use a branch, with the understanding that "this is our focus 100%" for next few days and no other work will be done, with the risk of we have to spend a lot of time in testing. If it is more complex than that and will take weeks or months then branches is out of the question. The most common way around that is to first "shadow" framework v1 (i.e. repackage and change the package name, paths and/or namespace) and update all the current/old code to use the new imports. Then migrate one page/component at a time to framework v2, have a router based on some criteria to select which implementation to use. Then throw away all the old code once it is know to work in production and remove all the flags. Now I know that frameworks like React and whatnot is horrible when it comes to situations like this. There are always exceptions. The problem is when the strategy/band-aids to manage exceptions becomes the norm and just pretend that the problems isn't there. The problem I was trying to exemplify was that the three "not quite good enough features" held up the other seven because everything is based on if it is merged or not. Management are usually not that happy when they have to postpone a release of some features they have promised customers because of some problem with other features. CI/CD is meant to solve that issue.
    1
  52. 1
  53. 1
  54. 1
  55. 1
  56. 1
  57. 1
  58. 1
  59. 1
  60. 1
  61. 1
  62. 1
  63. 1
  64. 1
  65. 1
  66. ​ @aprilmintacpineda2713  I know that when there is something "new" people just want a set of rules and steps, a recipe with 5 steps on how to do it. Many things are more abstract and requires experience doing the thing, take the time to form a deeper understanding and once "it clicks" it's obvious and you no longer need the recipe and you just do. There is no "do these steps and you're CI", that would be nothing but cargo culting. We actually have to do the hard work and change how we work, think, behave, incentivise, collaborate, communicate and understand how work actually works. The amount of programmers in the world doubles every 5 years or so. About 10-12 years ago everyone went nuts with FB/PR/GitFlow and thus we can approximate that 75% of all programmers have never practiced or seen real Continuous Integration. From that we can also say that at any point in time 50% of all programmers has less than 5 years of experience. Then the practices that this industry was build on are forgotten and completely alien to all the new people, because most people do not learn, they are being taught, then they iterate that teaching to the next generation as the "one true way" and put in a lot of effort and rules, process, arguments and "personal credit" into that particular way. Then the people that's not doing what "you" have been taught are being told they must be "inexperienced unprofessional developers that has never done any real work". Context is king, and most people convince themselves that the thing they spent time "perfecting doing" is the right thing for all contexts. This of course goes both ways so we all need to be aware of our biases. The key is being able to adapt based on context, develop a deeper understanding of the system and not get stuck in doing what is convenient and be afraid of change.
    1
  67. 1
  68. 1
  69. 1
  70. 1
  71. 1
  72. 1
  73. 1
  74. 1
  75. 1
  76. 1
  77. 1
  78. 1
  79. 1
  80. 1
  81. 1
  82. 1
  83. 1
  84. 1
  85. 1
  86. 1
  87. 1
  88. 1
  89. 1
  90. 1
  91. 1
  92. 1
  93. 1
  94. 1
  95. 1
  96. 1
  97. 1
  98. 1
  99. 1
  100. 1
  101. 1
  102. 1
  103. 1
  104. 1
  105. 1
  106. 1