- Moment’in temel metin editörü için işbirlikli düzenlemeyi değerlendirmesi sonucunda, CRDT ve OT ailesi algoritmaların çevrimdışı doğrudan çakışmalarda kullanıcıların veri bozulması olarak görebileceği birleştirme sonuçları üretebildiği görüldü
- Alice’in tüm cümleyi silip Bob’un
ColorıColourolarak değiştirdiği basit bir örnekte bile, son belgede yalnızcauharfinin kalması gibi insanların amaçlamadığı sonuçlar ortaya çıkabiliyor - Moment’in kullanım senaryolarında denenen doğrudan çakışmaların yaklaşık %20–30’u kabul edilemez bulundu; görülme sıklığı ve olumsuz tepkiler nedeniyle bunun ürün deneyimi olarak savunulmasının zor olduğu düşünüldü
- Yjs, ShareJS ve Peritext çevrimdışı düzenlemeyi, uzun gecikmeli işbirliğini veya bağımsız kopyaların otomatik birleştirilmesini öne çıkarıyor; ancak algoritmalar kullanıcının niyetini ve sıralamayı bilemediği için sezgisel yöntemlere dayanıyor
- Çevrimdışı işbirlikli düzenleme yalnızca algoritma sorunu değil, daha çok bir UI/UX sorunu; git birleştirme arayüzü veya Ink & Switch’in collaborative history yaklaşımı gibi, insanların okuyup karar verebileceği bir birleştirme deneyimi gerekiyor
Moment’in işbirlikli düzenleme değerlendirmesinde ortaya çıkan sınırlar
- 2024’ün başlarında Moment, temel metin editöründe kullanacağı işbirlikli düzenleme sistemini araştırmaya başladı
- Çeşitli algoritmalar yalnızca çevrimiçi eşzamanlı düzenlemeyi değil, kullanıcıların sınırsız bir süre çevrimdışı düzenleme yaptıktan sonra tekrar çevrimiçi olduklarında değişikliklerin otomatik birleştirilmesini sağlayan çevrimdışı senaryoları da çözdüklerini iddia ediyordu
- Makaleleri ve sunumları ilk gördüklerinde, işbirlikli düzenleme topluluğunun problemin geneline dair “doğru cevaba” ulaştığını umdular
- Değerlendirme sürecinde CRDT ve OT ailesi algoritmalar doğrudan düzenleme çakışmalarını sezgisel olmayan şekilde çözdü; kullanıcılar da bu sonucu veri bozulması olarak algıladı
- Çevrimdışı düzenleme doğrudan çakışma olasılığını ciddi biçimde artırdığı için, Moment’in istediği çevrimdışı düzenleme deneyimini yalnızca bu algoritmalarla oluşturmak zordu
Silme ile yazım düzeltmesinin çakıştığı basit bir örnek
- Alice ve Bob aynı belgeyi çevrimdışıyken düzenler
- Belgede
The Color of Pomegranatesmetni vardır - Bob,
Coloryazımını İngiliz İngilizcesindekiColourbiçimine çevirir; Alice ise metnin tamamını siler - İkisi daha sonra çevrimiçi olduğunda bu iki düzenleme çakışır ve sistem, hangi düzenlemenin önce yapıldığını bilmeden bunları uzlaştırmak zorunda kalır
- Bu örnekte Alice ve Bob, sonunda içinde yalnızca
uharfi bulunan bir belge elde eder- Bu ne geçerli bir cümledir ne de geçerli bir kelime
- Kullanıcılar böyle bir sonucu Moment’in kendi verilerini bozması olarak görür
Doğrudan çakışmalarda tuhaf sonuçlar nadir değil
- Bu çakışma basit ve doğrudan bir düzenleme çakışmasıdır, ancak popüler işbirlikli düzenleme algoritmalarının desteklediği kabul edilebilecek kapsamın içindedir
- Gerçek sonuç, bir insanın kendi başına yazmayacağı bir belgeydi ve Moment ürününün verileri bozması olarak yorumlandı
- Kullanım senaryosuna göre değişmekle birlikte, Moment’in denediği doğrudan çakışmaların kabaca %20–30’u çevrimdışı düzenleme kullanım senaryosu için kabul edilemez sonuçlar verdi
- Olumsuz geri bildirimler ve görülme sıklığı birlikte değerlendirildiğinde, böyle sonuçları kullanıcılara açıklayıp savunmanın zor olduğuna karar verildi
Araçların öne sürdüğü çevrimdışı düzenleme desteği
- İlk başta bu sonuçlar ortaya çıkınca, bu araçların sunduğu şeyin yanlış anlaşıldığı düşünüldü
- Ancak her projenin açıklamaları, ilgili senaryonun destek kapsamı içinde olduğu şeklinde okunabiliyor
- Yjs, README’de
offline editingdesteğini açıkça belirtiyor - ShareJS, sıfır gecikmeden uzun bir tatil süresine varan gecikmelere kadar her durumda işbirliği yapılabileceğini söylüyor
- Peritext, kullanıcıların bir belgenin bağımsız kopyalarını düzenleyebileceğini ve bunların, kullanıcının niyetini mümkün olduğunca koruyacak şekilde otomatik birleştirilebileceğini açıklıyor
- Yjs, README’de
- Moment hâlâ bu soruna bir çözüm arıyor, ancak pratikte görülen hataların sıklığını ve türlerini bu iddialarla bağdaştırmanın zor olduğunu düşünüyor
Uzlaştırmasız algoritmaların temel sınırı
- Değerlendirme ilerledikçe, söz konusu algoritmaların Moment’in istediği davranışı göstermediği sonucuna varıldı
- Geriye kalan soru, bunun katkı yapılarak düzeltilebilecek bir sorun mu, yoksa algoritmanın temel bir sınırı mı olduğuydu
- Bunun temel bir sorun olarak görülmesinin üç nedeni var
- Algoritma Alice ve Bob’un niyetini bilemez; ikisine ne istediklerini e-postayla soramaz veya GitHub Pull Request arayüzündeki gibi inceletemez
- Alice’in tümünü silme önerisini ve Bob’un yazım düzeltmesi önerisini alıp sonucu sezgisel yöntemlerle belirlemek zorundadır
- Karakter düzeyinde çalışır ve çıktı hakkında yalnızca çok zayıf garantiler sunar
- Alice ve Bob, diğerinin ne yaptığını bilseydi düzenleme yapıp yapmama kararını farklı verebilirdi
- Bu algoritmalar, nedensel sırayı izleyememe sorunuyla da bağlantılıdır
Çevrimdışı düzenleme daha çok bir UI/UX sorunu
- Moment, zorlu algoritmayı uygulayınca gerçek çevrimdışı düzenleme desteğini yan ürün olarak elde edebileceğini umuyordu; ancak değerlendirme sonrasında bunu böyle görmek zorlaştı
- Kullanıcıların algoritma sonucunu veri bozulması olarak görmesi haklıydı; tuhaf sonuçlar algoritmanın doğasında vardı ve gerçek bir sorun olacak kadar sık gerçekleşebiliyordu
- Bir başka yorum, işbirlikli düzenlemeye kayda değer UI/UX kaynağı ayırmak gerektiğidir
- Algoritma sorunu tamamen çözemez, ancak çözümün bir parçası olarak rol oynayabilir
git birleştirme arayüzü ve araştırma yönü
- Zaten yaygın biçimde benimsenmiş bir belge birleştirme arayüzü olarak
gitvar - Araştırma sorusu, bu deneyimin ne kadar daha erişilebilir, anlaşılır ve otomatik hale getirilebileceğine daha yakındır
- 2009 civarında, git’in değişiklikleri otomatik birleştirmek için kullandığı algoritmalar üzerine çok tartışma vardı
- git, Myers O(ND) diff algorithm algoritmasını benimsedi; bu algoritma esas olarak biyologların BLAST türü dizi analizlerinde kullandığı bir algoritmaydı
- Bram Cohen, diff sonuçlarının sezgisel olmadığını düşünerek patience diff algorithm algoritmasını geliştirdi; bu da artık geliştirilmesi durmuş git rakibi bzr tarafından benimsendi
- O dönemde tartışma, insanların okuyabileceği diff’ler üretmeye odaklanıyordu; bugünkü tartışma ise algoritmanın insan müdahalesi olmadan bu sonuca ulaşıp ulaşamayacağına daha yakın
- Ink & Switch tarafından geliştirilen collaborative history gibi, işbirlikli düzenlemeyi UI/UX sorunu olarak ele alan araştırmalar devam ediyor
1 yorum
Hacker News yorumları
Eg-walker ve ShareJS’in yazarıyım. Yazı, çalışmalarıma karşı bir tondaymış gibi görünüyor olabilir ama aslında tamamen katılıyorum ve HN’de de yıllardır aynı şeyi söylüyorum.
Günümüz gerçek zamanlı iş birliği araçları, herkes çevrim içiyken birlikte düzenleme yaptığında iyi çalışıyor; ancak kullanıcılar çevrim dışıyken ya da uzun ömürlü dallarda düzenleme yapıyorsa birleştirme sırasında çakışma gösterimi ve elle inceleme seçeneği gerekiyor. Özellikle kodda bu daha da geçerli.
Neyse ki egwalker gibi algoritmalar tüm kullanıcıların karakter düzeyindeki düzenleme izlerini ve nedensel sıralamayı, yani Git DAG’ine benzer değişiklik sırasını sakladığı için Git’ten çok daha fazla bilgiye sahip. Bu yüzden dalları birleştirirken çakışma aralıklarını tespit edip gösterebilen ve kullanıcının bunları elle çözmesini sağlayan bir CRDT yapmak mümkün olmalı.
Algoritmik açıdan ilginç ama yeterince çözülebilir bir problem gibi görünüyor; garip şekilde metin düzenleme tarafında neredeyse kimse bunu denememiş gibi. Bu alana özgün ve değerli bir katkı yapmak istiyorsanız, bu CRDT ekosisteminde eksik olan önemli bir parça; birinin denemesini isterim.
[1] Bu yorumun alt tarafı: https://news.ycombinator.com/item?id=19889174
Bir sonraki ilginç mesele, çakışma çözümünün kendisi etrafında çakışmalar oluştuğunda ortaya çıkıyor.
Bu tür sistemleri değerlendirmek başlı başına yeterince zor bir teknik problem; bu yüzden birçok ekibin zorlanacağını düşünüyorum. Bu yüzden pratik tavsiyeyi hak ediyorlar ve bizim de bunu daha erken bilmiş olmayı dilediğimizi hissediyorum.
Zor kısım, çakışmanın çözüldü olarak işaretlenmesi. CRDT’ye bir alan eklemek kadar basit de olabilir; o durumda bunun da algoritmik bir çözüm sayılıp sayılmayacağını bilmiyorum.
[1] https://josephg.com/blog/crdts-go-brrr/
Program kodu düzenlemesi söz konusuysa, birleştirme sonucunun geçerli bir program olmasını beklersiniz; bu da çok daha derin bir tavşan deliğine dönüşür. JetBrains’te bu problemi AST tabanlı birleştirme ile çözmeye çalışan bir proje olduğunu, ancak çok daha derine indikten sonra buna değmeyeceğine karar verdiklerini duydum.
İnsanların kullandığı belgelerde izin verdiğim “çevrim dışı düzenleme” yalnızca yorum eklemektir. Düzenleme yok, otomatik birleştirme yok.
Otomasyonun konusu olan kaynak kodundaki “çevrim dışı düzenleme” için Git kullanıyoruz; Git de birleştirmeyi çözdüğünü iddia etmez, yalnızca revizyonları gösterir. Birleştirme, insan denetiminde ya da en iyi tahminle uzman otomasyon tarafından yapılan bir iştir; başarının doğrulanması için hâlâ inceleme ve test gerekir.
Mekanik birleştirme algoritmaları, çakışma türüne göre daha iyi ya da daha kötü performans gösterebilir; ama sonuçta hiçbir CRDT, birleştirilmiş metnin kullanıcının söylemek istediği şey olup olmadığını判断layamaz.
Upwelling makalesi, yazıda anlamsal çakışma ile dilbilgisel çakışma diye adlandırdıkları farkı daha ayrıntılı ele alıyor: https://inkandswitch.com/upwelling/
Ciddi iş birliğinin sonunda bir belge inceleme problemi de olduğunu düşünüyorum. Gazetecilikte ya da bilimsel yayıncılıkta özellikle böyle; toplantı notlarında ise çoğunlukla göz ardı edilebilir.
Upwelling’e de bağlantı vermek istiyordum ama adını hatırlayamadım; teslim tarihi yüzünden yerine başka bir bağlantı kullandım.
CRDT uygulamalarının bir başka karanlık tarafı da altyapı yükü. Geçmişte bunu derinlemesine yazmıştım[0] ve Supabase’in de birkaç yıl önce Postgres için CRDT uzantısı yazısında[1] benim deneysel bulgularımla aynı sonuca vardığını görmek sevindiriciydi.
CRDT kullanacaksanız Redis gibi bir şey kullanmak ya da bellek kullanımı düşünmesi bile acı verse de MyRocks[2] ya da RocksDB/LevelDB tabanlı bir şey kullanmak daha iyi. Ne yaparsanız yapın, arka uç olarak RDBMS, özellikle de Postgres koymamalısınız.
[0]: https://news.ycombinator.com/item?id=40834759
[1]: https://supabase.com/blog/postgres-crdt
[2]: http://myrocks.io
Bu yazıdaki gözlemler doğru. CRDT, dağıtık veri yapıları için harika bir biçimsel model; ancak tüm çatışmaları otomatik olarak çözmesi gerektiği fikri, adının da söylediği gibi çatışmasız çoğaltılmış veri tipi düşüncesi, bana hep rahatsız edici gelmiştir.
Yazının gösterdiği gibi bunun umutsuz bir çaba olduğunu düşünüyorum. Gereken şey, çatışmaları paylaşmayı ve işbirliğiyle çözmeyi mümkün kılan düzgün bir yapısal gösterim; kontrolü kullanıcıya geri vermeli ve çözüm sürecini desteklemeli. Sevdiğim makalelerden biri olan “Turning Conflicts into Collaboration” [1] bu fikri ikna edici biçimde ele alıyor.
Devam eden doktora araştırmam kapsamında, kafes teorisine dayalı yapısal çatışma gösterimi için biçimsel bir model olan “Lazy Merging: From a Potential of Universes to a Universe of Potentials” [2] geliştirdim. Tesadüfen bu da bir CRDT, ama çatışmaları otomatik çözmeye çalışmıyor; onları işbirliğine dayalı belgenin içinde temsil ediyor. Matematiksel yaklaşınca, tekrar tekrar birleştirilmiş mevcut çatışmalardan sonra bile birleştirmenin tamlığı, minimalliği ve tekilliği gibi güçlü özellikleri garanti eden basit bir kavramsal modele ulaşabildim; birleştirme hesaplaması da çok kolay.
[1] https://doi.org/10.1007/s10606-012-9172-4
[2] https://doi.org/10.14279/tuj.eceasst.82.1226
Çatışma karmaşık bir kavram ve “conflict-free” sonucu tanımlayan bir ifade olarak teknik açıdan doğru olsa da, bu yazıda ve yukarıdaki yorumda görüldüğü gibi yanlış anlamalara yol açabiliyor.
Değişmelilik, Bob değişiklikleri [Bob, Alice] sırasıyla, Alice ise [Alice, Bob] sırasıyla uygulasa bile ikisinin de aynı belgeye ulaşması özelliğidir. Daha yüksek bir soyutlama düzeyinde belgenin anlamlı bir biçimde “çatışmasız” olduğu anlamına gelmez.
Birden fazla farklı öznenin gerçek zamanlı koordinasyon olmadan aynı anda tek bir veri parçası üzerinde yetkiye sahip olması kavramının genel olarak çözülemez olduğunu düşünüyorum. Bu, dağıtık sistemlerden zaten öğrendiğimiz bir ders; belge üzerinde dağıtık düzenlemeyi düşününce bu yazıda da gayet iyi görünüyor.
Uçak kokpitindeki çift giriş, çocuk yetiştirme ve akla gelebilecek başka farklı örneklerde de aynı ilke geçerli gibi.
Ayrıca buna “çözülebilir” demek de komik; çünkü şu anda dünyanın büyük bir kısmı, hesaplamanın nihai sonucunu LLM’lerin kaotik çıktısına yakın bir şeyin belirlemesini düşünüyor olabilir.
İşbirliğine dayalı metin düzenlemede yaygın kullanılan algoritmalar olan CRDT ve OT, düzenleme işlemlerinin ne yaptığı ve nasıl etkileştiği konusunda katı cebirsel gereksinimlere sahiptir.
Bu yüzden sunucu “Colour” örneğini UX açısından makul şekilde ele alacak kadar akıllı olsa bile, iyimser istemci tarafı düzenleme için buna karşılık gelen CRDT/OT’yi tasarlamak çok zordur.
CRDT/OT kullanmazsanız bunu aşabilirsiniz. Örneğin sunucu işlemleri aldığı sırayla işler ve istediğiniz UX mantığını uygular; istemci de bunun üzerinde iyimser düzenlemeye izin vermek için rebase/tahmin stratejisi kullanır. Bkz: https://doc.replicache.dev/concepts/how-it-works
Bunu metin düzenlemeye uygulamanın da zorlukları var, ancak bunlar burada tartışılan CRDT/OT sorunundan ayrı.
Bunun, matematiksel, nedensel ve entropik çatışma kavramlarının anlamsal çatışma ile birbirine karıştırılmasından kaynaklandığını düşünüyorum. Ben de bir zamanlar ters yönde aynı hatayı yapmıştım ve ne dediğimi bilmediğim bana net biçimde söylenmişti.
Ağaçları dikkate almaya başlayınca işler çok daha dağınık hale geliyor. Örneğin yJS, JSON belgeleri üzerinde çalışır. UI yalnızca sığ seviyeyi gösteriyor ve derin seviyeler açılmamışsa, kullanıcı silinen düzenlemeyi hiç görmeyebilir.
Çatışmaları koruyan CRDT sınıfları içinde, hatırladığım kadarıyla bir register’ın birden fazla değer alabilmesi en umut verici seçenek gibi görünüyor. Kullanıcıya bu tür çatışmalar sunulmalı; hatta tamamen görsel olarak da gösterilebilir. Geçmişe göz atabilmeyi sağlamak da, tuhaf bir şeyin nasıl ortaya çıktığını veya kendi değişikliğinin nasıl kaybolduğunu kullanıcının anlamasını sağlayan pratik bir alternatif gibi görünüyor.
Torvalds’ın kendisinin de otomatik birleştirmeyle nelerin başarılabileceği konusunda epey kötümser olduğunu hatırlıyorum. Ve bu değerlendirme doğruydu.
Git’in, yeterince akıllı bir algoritmanın otomatik olarak doğru şeyi yapması yoluyla bir sürüm kontrol sisteminin “birleştirme sorununu çözebileceği” ya da çözmesi gerektiği fikrini reddettiğini söylemişti.
Çevrimdışı düzenlemenin bir UI/UX sorunu olduğuna katılıyorum. Daha derindeki neden, bilişim sektörünün eski çözümleri tekrar etme alışkanlığı ve “genel olarak 5 librelik bir torba 10 librelik bir torbadan daha kullanışlı olduğuna göre, 10 libre eşya tek bir 5 librelik torbaya konmalı” inancı.
“Metin editörü”nün temel imgesi Mosaic textarea, MacWrite ya da ikisinin arasında bir şey olduğundan, genelde birleştirmeyi bunun üstüne en az değişiklikle eklemeye çalışıyorlar. Menü öğesi ya da küçük bir iletişim kutusundaki birkaç seçenek gibi. Menünün derinlerinde GUI birleştirme desteği olsa bile ya programcılara yönelik diff/merge korku gösterisi düzeyinde kalıyor ya da sisin içinde gemi kullanmak gibi tehlikeli, üstü çizili metin tabanlı bir görünümden ibaret oluyor.
Ama çevrimdışı iş birliği içeren metin düzenlemede kısmen elle birleştirme sürecin merkezindedir ve editör tasarımının merkezinde de olmalıdır. Ne yazık ki MacWrite, kaçması zor bir yerel optimumdur.
Örneğin “kargo kültü gibi taklit” ve “eski çözümler” diyen birinin sonraki sözü çoğu zaman “kodu metin olarak değil, sözdizimi ağacı olarak düzenleyin” oluyor; ama sorun aynı kalıyor. Sadece “karakter”i “cümle”yle değiştirmek yeterli.
Bob bir
ifdeyimininelsedalına bir satır eklediyse ve Aliceelsedalıyla birlikte tüm deyimi sildiyse, akıllı bir sistem ne yapmalı?Genel olarak bu yaklaşımın doğru olduğuna katılıyor gibiyim.
Soruları veya geri bildirimleri alabilirim. Bir iki saat toplantıda olacağım ama bu konular hakkında konuşmayı seviyorum. Buradan ya da e-postayla, hangisi kolaysa gönderebilirsiniz: alex@moment.dev
Git, açık onay olmadan yerel değişiklikleri otomatik olarak araya katmaz. bzr de böyle bir şeyi hayal bile etmezdi. Ama Google Docs gibi şeyler bunu seve seve yapıyor.
Şimdiye kadarki ilerleme harika; erken erişim programının da iyi gitmesini dilerim.
differential sync(https://neil.fraser.name/writing/sync/) uyguladım. Diğerlerini anlamadım ve grugnotes.com uygulamasında bu en basit görünen seçenekti.
Uygulama epey kaba saba ve tamamen gerçek zamanlı da değil, ama örnekteki birleştirmeyi kimin önce çevrimiçi olduğundan bağımsız olarak düzgün şekilde hallediyor. Silme işlemi önce çevrimiçi gelirse
coloursürümü atılıyor ve düzenleme geçmişine de kaydedilmiyor.Muhtemelen daha fazla sorun vardır ve ikiden fazla kullanıcı durumunda ne olacağını da bilmiyorum, ama kendi kullanımım için memnunum.