~jan0sch/was-ist-eigentlich-darcs

~jan0sch/was-ist-eigentlich-darcs/slides.tex
 ..
0 \documentclass[aspectratio=1610]{beamer}
1 \usetheme{metropolis}
2 \usepackage[utf8]{inputenc}
3 \usepackage{booktabs}
4 \usepackage{lmodern}
5 \usepackage{FiraSans}
6 \usepackage{minted}
7 %\usepackage{pgfpages}
8 %\pgfpagesuselayout{4 on 1}[a4paper,border shrink=1cm,landscape]
9 \title{Was ist eigentlich Darcs?}
10 \date{06.07.2023}
11 \author{Jens Grassel}
12 \institute{Wegtam GmbH}
13 \begin{document}
14 \maketitle
15
16 \section{Versionsverwaltung}
17 \begin{frame}[fragile]{Früher so...}
18 Wir ändern etwas und tun vorher etwas in der Art:
19 \begin{minted}{bash}
20 % cp quelltext.c quelltext.c.bak
21 \end{minted}
22 Dann ändern wir nochmal was:
23 \begin{minted}{bash}
24 % cp quelltext.c quelltext.c.bak2
25 \end{minted}
26 Und so weiter\ldots
27 \end{frame}
28
29 \begin{frame}{Versionsverwaltungssoftware}
30 Software nimmt uns das mittlerweile ab und es gab eine \textit{Evolution} von lokaler über zentraler zu verteilter Versionsverwaltung.
31 \begin{alertblock}{Aber welche nehmen wir?}
32 \begin{itemize}
33 \item CVS (zentral) - Bitte nicht!
34 \item SVN (zentral) - Bitte auch nicht!
35 \item Git (verteilt)
36 \item Mercurial (verteilt)
37 \item Darcs (verteilt)
38 \item Pijul (verteilt)
39 \item Fossil (verteilt \textit{und} Tickets etc.pp. mit drin)
40 \item Das kann den ganzen Tag so weitergehen. ;-)
41 \end{itemize}
42 \end{alertblock}
43 \end{frame}
44
45 \section{Aber Git hat doch gewonnen!?!}
46 \begin{frame}{Ja, kann man so sagen.}
47 Die Vorteile von Git:
48 \begin{itemize}
49 \item es ist sehr schnell
50 \end{itemize}
51 \end{frame}
52
53 \begin{frame}{Grundlegende Abläuft mit Git}
54 Ihr kennt das sicherlich:
55 \begin{itemize}
56 \item \mintinline{bash}{edit $FILE}
57 \item \mintinline{bash}{git add $FILE}
58 \item \mintinline{bash}{git commit}
59 \item \mintinline{bash}{git push}
60 \item Argh, Fehlermeldung!
61 \item \mintinline{bash}{git fetch}
62 \item \mintinline{bash}{git rebase}
63 \item \mintinline{bash}{git push}
64 \end{itemize}
65 Und über \mintinline{bash}{git checkout / branch / switch} reden wir noch gar nicht.
66 \end{frame}
67
68 \begin{frame}{Auch immer beliebt...}
69 \begin{itemize}
70 \item \mintinline{bash}{git rebase / git merge}
71 \item stundenlanges Beheben von Mergekonflikten
72 \end{itemize}
73 Um fair zu sein: Das passiert eigentlich nur, wenn mehrere Leute an einem Repository arbeiten.
74 \begin{alertblock}{Aber ist das nicht der Sinn von Versionsverwaltung?}
75 \end{alertblock}
76 \end{frame}
77
78 \section{Was macht Darcs anders?}
79 \begin{frame}{Grundlegende Abläufe mit Darcs}
80 Recht ähnlich, aber weniger:
81 \begin{itemize}
82 \item \mintinline{bash}{edit $FILE}
83 \item \mintinline{bash}{darcs record}
84 \item \mintinline{bash}{darcs push}
85 \item \mintinline{bash}{darcs pull}
86 \end{itemize}
87 Warum? $\rightarrow$ Es gibt keine \textit{Staging Area}!
88 \end{frame}
89
90 \begin{frame}[fragile]{Interaktion mit dem Menschen!}
91 Alle Kommandos von Darcs sind per se interaktiv!
92 \begin{minted}[fontsize=\small]{diff}
93 % darcs record
94 addfile ./README.md
95 Shall I record this change? (1/2) [ynW...], or ? for more options: y
96 hunk ./README.md 1
97 +# Was ist eigentlich Darcs?
98 +
99 +Es wird das Metropolis-Theme genutzt.
100 +
101 +Die Folien können mittels `pdflatex -shell-escape slides.tex` erzeugt werden.
102 +
103 Shall I record this change? (2/2) [ynW...], or ? for more options: y
104 Do you want to Record these changes? [Yglqk...], or ? for more options: y
105 Finished recording patch 'README'
106 \end{minted}
107 \end{frame}
108
109 \begin{frame}{Sehr viel genauere Erfassung von Änderungen!}
110 \begin{itemize}
111 \item Patches meist zeilengenau erfaßbar
112 \item damit [fast] keine Notwendigkeit für Branches mehr
113 \item detaillierte Änderungserfassung beim Commit (record)
114 \item Patches für einen Tag (Release) einzeln auswählbar
115 \item Abhängigkeiten zwischen Patches veränderbar
116 \end{itemize}
117 \end{frame}
118
119 \begin{frame}{Die Lösung aller Probleme?}
120 Nein, auch Darcs hat Schwächen:
121 \begin{enumerate}
122 \item Konflikte bzw. deren Lösung landen nicht im Repository
123 \begin{itemize}
124 \item Patch kommt rein $\rightarrow$ Konflikte
125 \item lokal behoben
126 \item aber kann nicht per Push gesendet werden, da nicht snapshot-basiert
127 \end{itemize}
128 \item darcs clone bei großen Repos nicht so schnell wie andere DVCS
129 \item häufig lokaler Index "kaputt"
130 \begin{itemize}
131 \item leicht zu beheben: \mintinline{bash}{darcs check / repair}
132 \end{itemize}
133 \item darcs send schwieriger aufzusetzen als git send-email
134 \item das sog. "exponential merge problem"
135 \begin{itemize}
136 \item tritt eigentlich seit Version 2 nicht mehr auf
137 \end{itemize}
138 \end{enumerate}
139 Außerdem gibt es kein "force push", aber ist das wirklich ein Nachteil?
140 \end{frame}
141
142 \begin{frame}{Patch vs. Snapshot}
143 "patch based"
144 \begin{itemize}
145 \item nur einzelne Patches und deren Abhängigkeiten gespeichert
146 \item Reihenfolge egal, wenn gleiches Ergebnis
147 \item langsamer, da ggf. viele Berechnungen ($Zustand = \sum P$)
148 \end{itemize}
149 "snapshot based"
150 \begin{itemize}
151 \item immer der gesamte Zustand aller Dateien im Repository gespeichert
152 \item schnell, da immer "alles da"
153 \item größerer Platzbedarf ($Platz = Anzahl_{Commits} * \sum Platz_{Datei}$)
154 \begin{itemize}
155 \item durch interne Komprimierung reduziert
156 \end{itemize}
157 \item häufiger Konflikte bei unterschiedlichem \textit{HEAD}
158 \end{itemize}
159 \end{frame}
160
161 \section{Was sind die Unterschiede im Alltag?}
162
163 \begin{frame}{Flexibleres Arbeiten mit Darcs}
164 \begin{enumerate}
165 \item Commit von "Hunks" statt ganzen Dateien $\rightarrow$ kleinere Patches
166 \item weniger (keine) Gedanken um Merge-Konflikte
167 \begin{itemize}
168 \item a.k.a. "Bin ich auf dem aktuellen HEAD?"
169 \end{itemize}
170 \item "spontane" Zweige ("spontaneous branches")
171 \begin{itemize}
172 \item a.k.a. selektives Auswählen der Änderungen für einen Patch
173 \end{itemize}
174 \item flexibleres Tagging
175 \begin{itemize}
176 \item manuelle Auswahl der Patches, die zu einem Tag gehören sollen
177 \end{itemize}
178 \end{enumerate}
179 \end{frame}
180
181 \begin{frame}{kleinere Patches}
182 Die Auswahl von einzelnen Änderungen (Hunks) erleichtert es:
183 \begin{itemize}
184 \item gezielt Änderungen in einem Commit zusammenzufassen
185 \item bzw. Änderungen auszulassen
186 \end{itemize}
187 \end{frame}
188
189 \begin{frame}{weniger (keine) Gedanken um Merge-Konflikte}
190 Es gibt auch noch Merge-Konflikte, aber eher selten, da:
191 \begin{itemize}
192 \item kleinere (bessere?) Patches
193 \item nicht ganz so wichtig auf dem gleichen Stand zu sein
194 \end{itemize}
195 Letztlich: Dadurch, daß Konflikte bzw. deren Lösungen halt nicht im Repo
196 auftauchen, wird man da sehr viel sensibler für. ;-)
197 \end{frame}
198
199 \begin{frame}{"spontane" Zweige ("spontaneous branches")}
200 Die gezielte Auswahl von Änderungen macht es möglich, daß an mehreren
201 Dingen zeitgleich gearbeitet werden kann.
202 \begin{itemize}
203 \item hat natürlich Grenzen
204 \end{itemize}
205 \end{frame}
206
207 \begin{frame}{flexibleres Tagging}
208 \mintinline{bash}{darcs tag}
209 \begin{itemize}
210 \item per Vorgabe alle Patches seit dem letzten Tag
211 \item aber auch gezielte Auswahl möglich
212 \item ermöglicht einfachen Release auch wenn schon andere Patches mit drin sind
213 \end{itemize}
214 \end{frame}
215
216 \begin{frame}{Weniger "Gedanken um das VCS-Tooling"}
217 \begin{itemize}
218 \item intuitivere Bedienung
219 \item kein rebase mehr, da quasi "frei Haus" mit darcs
220 \item kein internalisiertes Umschiffen von Git-Tücken mehr
221 \item Erkenntnis, das "web based pull requests" womöglich ein Fehler sind
222 \begin{itemize}
223 \item Review primär per E-Mail (machen auch viele große Git-Projekte)
224 \end{itemize}
225 \item selbst knifflige Sachen immer leicht lösbar (unrecord, revert)
226 \end{itemize}
227 \end{frame}
228
229 \begin{frame}{Aber \textit{alle} nehmen Git!}
230 Dann machen wir Git etwas "darcsiger"
231 \begin{enumerate}
232 \item Anpassung des Diff-Algorithmus
233 \begin{itemize}
234 \item \mintinline{bash}{git config --global diff.algorithm histogram}
235 \item sogar besser als \textit{patience} von Darcs
236 \item gibt bessere Diffs/Patches
237 \end{itemize}
238 \item Nutzen von \mintinline{bash}{git commit -p}
239 \begin{itemize}
240 \item ermöglicht wie darcs einzelne Hunks auszuwählen, die ins Commit sollen
241 \end{itemize}
242 \end{enumerate}
243 \end{frame}
244
245 \begin{frame}{Fazit}
246 \begin{itemize}
247 \item macht \textit{mehr Spaß} / funktioniert für mich intuitiver
248 \item ist kein Allheilmittel
249 \item E-Mail als Medium für Patches wiederentdeckt
250 \item der Kopf ist freier als mit Git
251 \end{itemize}
252 \center{\Large{Probiert es einfach mal aus, es lohnt sich!}}\\
253 \end{frame}
254
255 \begin{frame}[standout]{}
256 \Huge{Vielen Dank!}\\
257 \small{http://darcs.net - Darcs Homepage}\\
258 \small{https://darcsbook.acmelabs.space/ - The Darcs Book}
259 \end{frame}
260 \end{document}