Comments by "" (@traveller23e) on "Fireship" channel.

  1. 166
  2. 143
  3. 61
  4. 55
  5. 37
  6. 36
  7. 35
  8. 34
  9. 32
  10. 32
  11. 31
  12. 30
  13. 30
  14. 27
  15. 25
  16. 24
  17. 24
  18. 23
  19. 21
  20. 17
  21. 17
  22. 16
  23. 15
  24. 12
  25. 12
  26. 11
  27. 11
  28. 10
  29. 10
  30. 9
  31. 9
  32. 9
  33. 9
  34. 9
  35. 8
  36. 8
  37. 8
  38. 8
  39. 7
  40. 7
  41. 7
  42. 7
  43. I have Arch on one machine, NixOS on another. They have fundamentally different use-cases. Arch is fantastic if you're decently good at configurations and have a single machine you frequently need to adjust settings on, especially thanks to its incredible docs. It also does a pretty good job of ensuring you don't end up with meaningless duplicate packages. However, if you want any kind of partitioning of program installation it starts to work against you, e.g. it's easy installing a program on the system but hard to install it for just one user. It's also hard to install multiple versions of stuff if you need that (not normally a problem but it could be). Additionally, in a fairly normal install it's more or less incompatible with Haskell development due to the fact that by default Arch uses dynamically linked libraries and Haskell revolves around statically linked ones (technically options for dynamic linking exist, but mileage may vary and to give an idea some related critical bugs have sat unfixed for years). I installed nixOS for the facility of operations with Haskell, and I can see how it would be great if you needed to install identical systems on multiple computers. It allows having packages installed only when you're in certain environments making it really easy for groups to share their build dependencies, however what's not mentioned in the video is that understanding how any of that works is very difficult due in large part to lack of clear guides and when there is documentation it tends to only cover one small part of the setup so it's up to you to figure out how the components work together. Additionally, if you're doing a lot of tweaks to your config firstly they take forever to test and secondly you'll quickly end up with lots of different versions of your machine each with its own set of binaries etc. Of course you can clean that up. The other thing is that although the versioning saves the state of your installed programs, it does not save the state of your homefiles which could easily include configs written by those same programs so it could be rolling back doesn't restore some data deleted or updated in the interim.
    7
  44. 7
  45. 6
  46. 6
  47. 6
  48. 6
  49. 5
  50. 5
  51. 5
  52. 5
  53. 5
  54. 5
  55. 5
  56. 4
  57. 4
  58. 4
  59. 4
  60. 3
  61. 3
  62. 3
  63. 3
  64. 3
  65. 3
  66. 2
  67. 2
  68. 2
  69. 2
  70. 2
  71. 2
  72. 2
  73. 2
  74. 2
  75. 2
  76. 2
  77. 2
  78. 2
  79. 2
  80. 2
  81. 2
  82. 2
  83. 2
  84. 2
  85. 2
  86. 2
  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
  107. 1
  108. 1
  109. 1
  110. 1
  111. 1
  112. 1
  113. 1
  114. 1
  115. 1
  116. 1
  117. 1
  118. 1
  119. 1
  120. 1
  121. 1
  122. 1
  123. 1
  124. 1
  125. 1
  126. Note about the "a value cannot be null, but you can make it nullable by adding a question mark". The short answer is this is inaccurate, but a full explanation is that there are two kinds of data types, reference types (defined by classes and interfaces, e.g. string) and value types (defined by structs, e.g. int). Reference types can be null, however value types cannot. Therefore, if you create a new variable of a value type (as in "SomeType variableName;") it'll be set to the default value, but for a reference type it'll be set to null. If you need a nullable value type, that's actually a fundamentally a different type and is written with a question mark at the end. So, int? can be null, but int cannot. If you need to compare them, a cast is involved (if I recall correctly the int gets implicitly cast to int? prior to comparison). There are also other important differences between value and reference types, so if you're new to the language at some point be sure to learn them. However, for some reason the designers of C# decided that this was confusing to newcomers [citation needed] and so in the most recent versions of the language by default there's a warning (hence the yellow squiggle, not red) if the compiler detects that a value of reference type that's not explicitly nullable (the question mark) could at some point in the execution become null. This has the advantage that you don't have to worry about null checking if the value isn't marked as nullable, assuming your dev team does a good job of paying attention to warnings and resolving the issues. The code base I'm working on currently has something along the lines of 4700 warnings if my memory serves (it's also an older version of C#, from before they decided to start all this non-nullable reference type stuff). However, there are a few disadvantages to this behavior too. One is that you have to explicitly mark the type if you ever plan on setting the value to null, a frequent thing to want to do. Additionally, if you're trying to work only with non-nullable variables it can make some patterns more cumbersome (e.g. "SomeType returnResult; if (something) {doStuff(); returnResult = someValue;} else returnResult = someOtherValue; Log($"Returning {returnResult}!"); return returnResult;"). One could also argue that it can confuse people at a fundamental level about the differences between classes and structs, sort of like in Java the line between abstract class and interface was somewhat muddied when they introduced default implementations in interfaces. And then you get the people like me who just hate it for no solid good reason other than "this isn't how I learned it!" and try to justify their hatred through other arguments.
    1
  127. 1
  128. 1
  129. 1
  130. 1
  131. 1
  132. 1
  133. 1