თეორია, რომელიც უკვე არსებობდა
MOAD-ის თითოეულ დეფექტს ჰქონდა ცნობილი გადაწყვეტა ათწლეულობით ადრე, ვიდრე სისტემურად აღმოჩენილ იქნებოდა 2026 წელს. დეფექტები არ დარჩა იმიტომ, რომ არავინ იცოდა უკეთესი. ისინი დარჩა იმიტომ, რომ ცოდნა არ არის იგივე, რაც აღმოჩენა.
MOAD-0001: O(N²) list.contains
დონალდ კნუთი, 1973. კომპიუტერული პროგრამირების ხელოვნება, ტომი 3: დალაგება და ძებნა. ჰეშ-ცხრილები O(1) ძებნისთვის სრულად იყო განსაზღვრული ანალიზით 1973 წელს. განსხვავება O(N) წრფივ ძებნასა და O(1) ჰეშ-ძებნას შორის — დოკუმენტირებული, ფორმალიზებული და ფართოდ ციტირებული. Java-მ გამოუშვა HashSet 1.0 ვერსიაში (1996). Python-მა გამოუშვა set როგორც პირველი კლასის ტიპი 2.4 ვერსიაში (2004). გამოსწორება არსებობდა 30 წლის განმავლობაში, სანამ ის ყველა ეკოსისტემაში ნაგულისხმევ იდიომად იქცეოდა.
რიჩარდ ჰამინგი, 1986. Bell Labs-ის ლექციები (მოგვიანებით გამოქვეყნდა როგორც მეცნიერებისა და ინჟინერიის ხელოვნება, 1997). ჰამინგი აშკარად ასწავლიდა ალგორითმულ სირთულეს, სწორისა და ეფექტურის განსხვავებას და იმ საფრთხეს, რომელიც წარმოიქმნება მცირე მასშტაბზე მომუშავე სისტემების აგებისას, რომლებიც დიდ მასშტაბზე ვერ ფუნქციონირებენ. მან ამას უწოდა „დღეს ხილული პრობლემისთვის დიზაინის შექმნა, არა იმ პრობლემისთვის, რომელსაც ხვალ წააწყდებით.“
MOAD-0002: გლობალური მდგომარეობის გაზიარებული დაწყვილება
დევიდ პარნასი, 1972. „კრიტერიუმები, რომლებიც გამოიყენება სისტემების მოდულებად დაშლისას.“ CACM, დეკემბერი 1972. პარნასი ამტკიცებდა, რომ მოდულები უნდა დაიშალოს ინფორმაციის დამალვის პრინციპით — თითოეული მოდული ფლობს საკუთარ მდგომარეობას, არ არსებობს გაზიარებული ცვალებადი გლობალური ცვლადები. ეს არის პირდაპირი თეორიული წინამორბედი Intertangle-ის გამოსწორებისა. პარნასი აშკარად აღნიშნავდა: გლობალური გაზიარებული მდგომარეობა ქმნის უხილავ დაწყვილებას, რომელიც ტესტირებით არ ვლინდება.
MOAD-0003: ThreadLocal-ის იდენტობის გაჟონვა
Java 1.2, 1998. ThreadLocal გამოვიდა როგორც Java-ს სტანდარტული ბიბლიოთეკის კლასი. იმ მომენტში, როდესაც thread pooling და ThreadLocal ერთად არსებობდა, გაჟონვის მექანიზმი უკვე არსებობდა. დეფექტი სტრუქტურულია: მატარებელი, რომლის სიცოცხლის ხანგრძლივობა არის thread, არა სამუშაო ერთეული. დოკუმენტაცია ამის შესახებ აფრთხილებდა Java EE-ის სასიცოცხლო ციკლის ადრეული ეტაპებიდანვე.
MOAD-0004: დალოგილი რწმუნებები
RFC 1945, 1996. HTTP/1.0 განსაზღვრა Authorization header-ს. რწმუნებების დალოგვის დეფექტი შესაძლებელი გახდა იმ დღიდან, როდესაც Authorization header არსებობდა. OWASP დაარსდა 2001 წელს და დაადასტურა რწმუნებების დალოგვა როგორც დაუცველობის კლასი თავის პირველ სახელმძღვანელოებში. შაბლონი: Authorization header → log middleware → cleartext credentials დისკზე. ცნობილია პირველი HTTP auth სპეციფიკაციიდან.
MOAD-0005: Thundering Herd / Cache Stampede
Unix-ის ბირთვი, 1993. „მრავალრიცხოვანი ნახირის პრობლემა“ — N პროცესის ერთდროული გაღვიძება საერთო მოვლენაზე — გამოჩნდა Unix-ის ბირთვის განვითარების დისკუსიებში 1990-იანი წლების დასაწყისში. დაგ შმიდტის მუშაობა Reactor ნიმუშზე (1994) და Half-Sync/Half-Async-ზე (1995) მიმართული იყო სინქრონიზაციის ინფრასტრუქტურული დონის მოგვარებაზე. ქეშის შტამპედის ვარიანტი (N თრედი ერთსა და იმავე მნიშვნელობას ითვლის ქეშის გაცდენისას) დოკუმენტირებული იყო განაწილებული სისტემების ლიტერატურაში 2001 წლისთვის.
---
თეორია: დასრულებული. აღმოჩენის ინსტრუმენტები: არ არსებობს. უფსკრული „ცნობადსა“ და „აღმოჩენილს“ შორის მერყეობს 28-დან 54 წლამდე, დეფექტის მიხედვით.
ცნობადობის უფსკრული
დროის ხაზი აჩვენებს, რომ ყველა MOAD დეფექტს ჰქონდა ცნობილი გადაწყვეტა მინიმუმ 28 წლით ადრე, ვიდრე სისტემური აღმოჩენა მოხდებოდა. ყველაზე მოკლე უფსკრული (MOAD-0003) არის 28 წელი. ყველაზე გრძელი (MOAD-0002) არის 54 წელი.
ეს არ არის ისტორია უმეცრების შესახებ. კნუთი, პარნასი, ჰამინგი — ესენი არიან ყველაზე ციტირებული ავტორები კომპიუტერულ მეცნიერებაში. მათი ნაშრომები უნივერსიტეტებში ისწავლებოდა. მათი ტერმინოლოგია (Big O, ინფორმაციის დამალვა, ალგორითმული სირთულე) გახდა სტანდარტული სასწავლო პროგრამა.
რატომ რჩება კოდი: ხუთი პირობა
დეფექტი შემთხვევით არ რჩება. ხუთი სტრუქტურული პირობა, რომლებიც ერთდროულად არის წარმოდგენილი, ქმნის რჩენის გარემოს. თუ რომელიმე ერთ-ერთი მოიხსნება, გამოვლენა შესაძლებელი ხდება.
პირობა 1: სწორი გამომავალი
სია და სეტი წევრობის კითხვას ერთნაირად პასუხობენ. list.contains(x) და set.contains(x) ერთსა და იმავე ლოგიკურ მნიშვნელობას აბრუნებენ. ThreadLocal, რომელიც მოძველებულ იდენტობას ატარებს, მაინც ატარებს რაღაც იდენტობას — ის უბრალოდ არასწორ მოთხოვნას ეკუთვნის. დალოგილი მონაცემები სწორად ლოგდება — მონაცემები შეცდომის გარეშე აღწევს ლოგ-ფაილამდე. დეფექტი არ არის გაუმართაობა. ის გაუმართაობაა მხოლოდ ღირებულების ან უსაფრთხოების შედეგების თვალსაზრისით. გამომავალი მნიშვნელობების შემოწმების ტესტები გადის. ღირებულების ან უსაფრთხოების შედეგების შემოწმების ტესტები: უმეტესად დაუწერელია.
პირობა 2: CI-ში არ არის სირთულის ტესტები
დეიკსტრამ თქვა: „ტესტირება აჩვენებს დეფექტების არსებობას, არა მათ არარსებობას“. ჰამინგმა განავითარა ეს აზრი: დეფექტები, რომლებსაც ჩვენ ვამოწმებთ, არის ის დეფექტები, რომლებსაც ვპოულობთ. 2026 წლის CI პაიპლაინები ამოწმებენ: სისწორეს, ტიპის უსაფრთხოებას, API კონტრაქტებს, ფუნქციონალურ ქცევას. ისინი არ ამოწმებენ: ალგორითმულ სირთულეს თითო ოპერაციაზე, მეხსიერების ზრდას თითო გამოძახებაზე, ავტორიზაციის ჰედერის გასუფთავებას, თრედის იდენტობის სასიცოცხლო ციკლს.
არცერთი ტესტი არ მუშავდება. არცერთი ტესტი არ ჩავარდება. პაიპლაინი მწვანეა. დეფექტი უხილავია.
პირობა 3: Small-N წარმოშობა
კოდი იწერება და განიხილება განვითარების გარემოში. განვითარების გრაფები შეიცავს 50 კვანძს. განვითარების მოთხოვნების დატვირთვა შეიცავს 10 პარალელურ თრედს. განვითარების ქეშის გაცდენის მაჩვენებელი დაბალია (თბილი ქეში, ცოტა გასაღები). N=50-ზე O(N²) ღირებულება არის 2,500 ოპერაცია. უხილავი. N=50,000-ზე ღირებულება არის 2,500,000,000 ოპერაცია. 17-წუთიანი აშენება 1-წამიანი აშენების ნაცვლად.
ავტორმა, რომელმაც კოდი დაწერა, N=50,000 არასოდეს უნახავს. რევიუერმა, რომელმაც დაამტკიცა, N=50,000 არასოდეს უნახავს. დეფექტი არ იყო ხილული მისი დაწერის მასშტაბზე.
პირობა 4: კოპირება ვრცელდება კონტექსტის გარეშე
სწორი ალგორითმი ინსტრუქციულია. გაკვეთილები ასწავლიან სწორი მაგალითებით. დოკუმენტაცია აჩვენებს მომუშავე კოდს. იგივე Tarjan SCC ჩონჩხი — visited = [], შიდა if n not in visited — გვხვდება GHC-ში, Maven-ში, Python pip-ში, Cargo-ში, TypeScript კომპილატორში, Kotlin კომპილატორში, Scala კომპილატორში და javac-ში. სხვადასხვა გუნდი, სხვადასხვა ენა, სხვადასხვა ათწლეული. იგივე ნამარხი. თავდაპირველი ავტორის N=50 არ ვრცელდება კოდთან ერთად. რა ვრცელდება: სწორი შედეგი. რა რჩება უკან: შესრულების დაშვება.
პირობა 5: მასშტაბი იზრდება გაყინული კოდის გარშემო
კოდი არ იშლება. ინფრასტრუქტურა მასშტაბირდება. 2003 წელს 200 პაკეტისთვის დაწერილი დამოკიდებულებების გადამწყვეტი მუშაობს 50,000 პაკეტზე 2024 წელს. არავინ გადაწერს მას — ის მუშაობს. არავინ აპროფილირებს მას — CI მწვანეა. N, რომელიც O(N²) ღირებულებას კატასტროფულს ხდის, თანდათანობით, უხილავად მოდის წარმოების მასშტაბზე. მაშინ თავდაპირველი ავტორი უკვე წასულია. კოდი დამოკიდებულებაა. არავინ ეხება მომუშავე დამოკიდებულებებს.
დიაგნოზი: ხუთი პირობა
ხუთი პირობა: სწორი შედეგი, სირთულის ტესტების არარსებობა, მცირე-N წარმოშობა, კოპირება კონტექსტის გარეშე, მასშტაბი იზრდება გაყინული კოდის გარშემო.
ყველა ხუთი იყო წარმოდგენილი ყველა MOAD-ისთვის ერთდროულად. ეს არ არის დამთხვევა — ეს არის სტრუქტურული ხელმოწერა დანალექი დეფექტის კლასის.
რა თქვა ჰამინგმა
რიჩარდ ჰამინგის 1986 წლის ლექციები Bell Labs-ში — გამოქვეყნებული 1997 წელს როგორც მეცნიერებისა და ინჟინერიის ხელოვნება — შეიცავს გაფრთხილებებს, რომლებიც პირდაპირ აღწერენ MOAD დეფექტის ნიმუშს. ის არ აღწერდა MOAD-ს. ის აღწერდა საინჟინრო სისტემების სტრუქტურულ ტენდენციას, რომლებიც კალციფიცირდებიან ლოკალურად სწორი გადაწყვეტილებების გარშემო, რომლებიც გლობალურად ძვირი ხდება.
ჰამინგი სირთულეზე: „გამოთვლის მიზანია გაგება, არა რიცხვები. მაგრამ უნდა გქონდეთ ალგორითმის სწორი სირთულე, წინააღმდეგ შემთხვევაში რიცხვები არასოდეს მოვა. O(N²) ალგორითმი, რომელიც მუშაობს N=100-ზე, არ იმუშავებს N=1,000,000-ზე, სანამ თქვენ პენსიაზე გახვალთ.“
ჰამინგი კოპირებაზე: „დიდი ინჟინრები არ კოპირებენ უბრალოდ გადაწყვეტილებებს. ისინი ესმით, რატომ მუშაობს გადაწყვეტილება, რა პირობებში მოქმედებს და რა დაარღვევს მას. კოპირებული გადაწყვეტილება მისი პირობების გარეშე დროის ბომბია.“
ჰამინგი ტესტირებაზე: „იმის ტესტირება, რაც თქვენ გაზომეთ, არ არის იგივე, რაც იმის გაზომვა, რაც მნიშვნელოვანია. ჩვენ ვაშენებთ დეტალურ ტესტების კომპლექტებს იმ თვისებებისთვის, რომლებიც ავირჩიეთ ტესტირებისთვის. ჩვენ არ ვტესტავთ იმ თვისებებს, რომლებიც არ ავირჩიეთ. ის, რასაც არ ვტესტავთ, არის ის, რაც გვაკვირვებს წარმოებაში.“
Hamming on scale: 'პროექტის პირველ წელს დაშვებული შეცდომა ის შეცდომაა, რომელსაც მეათე წელსაც კი ასწორებ. ადრეული ვარაუდები ქვად იქცევა. პროექტი მათ გარშემო იზრდება. არავინ გადაწერს საძირკველს.'
გაფრთხილებასა და ოპერაციონალიზაციას შორის არსებული უფსკრული
ჰამინგის გაფრთხილებები სწორი იყო. ისინი ისწავლებოდა. მათ მოჰყავდათ მაგალითად. მათ სასწავლო პროგრამებში ანიჭებდნენ. მაგრამ გაფრთხილება არ არის დეტექტორი. ჰამინგმა აღწერა დეფექტის ფორმა. მან არ შექმნა ინსტრუმენტი, რომელიც CI-ში მუშაობს და აღნიშნავს O(N²) ცხელ ბილიკებს, ThreadLocal იდენტობის გაჟონვებს ან სერთიფიკატების ლოგირებას. უფსკრული „ცოდნადსა“ და „აღმოჩენადს“ შორის არის უფსკრული თეორიასა და მის ოპერაციონალიზაციას შორის, როგორც ავტომატიზებული ინფრასტრუქტურა.
MOAD არსებობს იმიტომ, რომ სფერომ შექმნა სისწორის ინფრასტრუქტურა და არა შესრულების ან უსაფრთხოების ინფრასტრუქტურა იმავე დონეზე. ერთეული ტესტები: სტანდარტული 1970-იანი წლებიდან. თვისებებზე დაფუძნებული ტესტები: სტანდარტული 1990-იანი წლებიდან. ალგორითმული სირთულის ბენჩმარკები CI-ში: 2026 წელსაც კი ექსპერიმენტულია.
გაფრთხილების ოპერაციონალიზაცია
ჰამინგმა გააფრთხილა სირთულის ქვად ქცევის, შეუმოწმებელი თვისებების, გადაწერილი გადაწყვეტების შესახებ მათი პირობების გარეშე და მასშტაბის მიერ ადრეული ვარაუდების ჩახშობის შესახებ. მან მოგვცა ლექსიკა. მან არ მოგვცა დეტექტორი.
MOAD-ის მილსადენი ავსებს ამ უფსკრულს: სკანირება → ბილეთი → პაჩი → ერთეული ტესტი → გამჟღავნება → PR → upstream merge. ეს არის ოპერაციონალიზებული ჰამინგი: არა მხოლოდ გაფრთხილება, არამედ ავტომატიზებული აღმოჩენა და გამოსწორების მილსადენი.
ფესტერის ხელმოწერა
MOAD-კლასის დეფექტს აქვს ამოსაცნობი ხელმოწერა. ყველა ხუთი პირობა ერთდროულადაა წარმოდგენილი. ყველა ხუთი შემოწმებადია ერთი სკანის დაწერამდე:
1. სწორი გამომავალი? გაუშვი სტანდარტული ტესტების ნაკრები. თუ გაივლის, დეფექტი წარმადობის ან უსაფრთხოების თვისებაა, არა სისწორის. ეს ნიშნავს, რომ სტანდარტული CI მას ვერ დაიჭერს.
2. სირთულის ტესტი არ არის? შეამოწმეთ CI კონფიგურაცია. არის თუ არა ბენჩმარკის ეტაპი? ადარებს თუ არა ალგორითმულ ქცევას (არა მხოლოდ კედლის დროს) წინა კომიტთან? თუ არა: პირობა არსებობს.
3. მცირე-N წარმოშობა? შეამოწმეთ git blame და თავდაპირველი კომიტი. რა იყო მონაცემთა ნაკრების ზომა პირველ განხორციელებაში? არის თუ არა ეს ზომა მიმდინარე წარმოების დატვირთვაზე 100×-ზე მეტით მცირე? თუ კი: პირობა არსებობს.
4. კოპირება ვრცელდება? მოძებნეთ შაბლონი მთელ კოდბაზაში და ეკოსისტემებში. ჩნდება თუ არა იგივე სტრუქტურული შაბლონი N≥3 დამოუკიდებელ კოდბაზაში საერთო წარმოშობის გარეშე? თუ კი: ფოსილი გავრცელდა. თითოეული კოპირება: ახალი ფესტერის ადგილი.
5. მასშტაბი იზრდება? შეამოწმეთ წარმოების მეტრიკა. რა არის N დღეს წინააღმდეგ N პირველი განლაგებისას? არის თუ არა ზრდის ტემპი მდგრადი? რა N-ზე ხდება დეფექტი ოპერაციულად კრიტიკული?
თუ ყველა ხუთი შემოწმებულია და დადასტურებულია: თქვენ გაქვთ MOAD-კლასის დეფექტი. გამოსწორება ყოველთვის ერთხაზიანი ან ერთმეთოდიანი ჩანაცვლებაა. აღმოჩენა რთული ნაწილია. გამოსწორება მარტივი ნაწილია.
ეს არის ის, რაც Hamming-ს ჰქონდა მხედველობაში: ინჟინერია არ არის გამოსწორების შესახებ. გამოსწორება მარტივია, როდესაც მას დაინახავთ. ინჟინერია არის სისტემების აშენების შესახებ, რომლებიც საშუალებას გაძლევთ დაინახოთ იგი.
ხელმოწერის გამოყენება
MOAD ფესტერის ხელმოწერა: სწორი გამომავალი + სირთულის ტესტის არარსებობა + მცირე-N წარმოშობა + კოპირება ვრცელდება + მასშტაბი იზრდება.
ეს ხელმოწერა არ შემოიფარგლება მხოლოდ ხუთი MOAD დეფექტით. იგი აღწერს დეფექტების კლასს, რომელიც ნარჩუნდება ნებისმიერ სისტემაში, სადაც სისწორის ტესტები ერთადერთი ავტომატური ხარისხის კარიბჭეა.