Kopyala-yapıştır programlamanın tehlikelerini programlayıcı olmayanlara açıklamanın iyi ve özlü yolu nedir? [kapalı]


27

Kopyala-yapıştır programlamanın problemlerini programcı olmayanlara gösterebilecek iyi bir benzetme veya metafor arıyorum. Zaman zaman potansiyel müşteriler için kod / sistem incelemeleri yapıyorum ve gördüğüm en yaygın sorunlardan biri kod tabanlarının her yerinde çok sayıda kopyala-yapıştır kodu. Bu, incelemelerde düzenli olarak dile getirdiğim bir şey ve bunun neden bir sorun olduğunu açıklamak zorunda olduğum her zaman (bu özellikle, yeniden kullanımın iyi bir şey olduğunu anlamak için programlama hakkında yeterli bilgiyi bilen müşteriler için zor, ancak bunun nedenini anlamak için yeterli değil) kopyala-yapıştır iyi bir yeniden kullanım şekli değildir). Açıkçası, sorunu kod bakımı açısından açıklayabilirim (ve yapabilirim), ancak programcı olmayanlarla eve varacak bu sorun için iyi ve özlü bir benzetme yapmak güzel olurdu. Analoji, ara ve değiştir işlevinin neden bu sorun için etkili bir çözüm olmadığını gösteriyorsa bonus. Baska öneri?

Sadece netleştirmek için (aşağıdaki Jaroslav'nın cevabına dayanarak) - Burada kod parçacıklarını kullanmaktan bahsetmiyorum; Gördüğüm (rahatsız edici sıklıkta) düzinelerce PHP veya ASP.NET sayfalarına yapıştırılan bazı kullanıcı verilerini (satır içi SQL sorgusu ile birlikte) almak için geniş kod kodlarının veya on satırlık bir kodun kopyalanması ve yapıştırılması. Bu nedenle, aynı projenin herhangi bir yerindeki kodu çoğaltın.

Güncelleme: Burada gerçekten çok iyi cevaplar var; Scott Whitlock'un cevabını neden seçtiğimi açıklamalarda açıklamıştım, fakat aynı zamanda, imalata aşina olan müşterilerle ilgileniyorsanız, whatsisname'in cevabını şiddetle tavsiye ediyorum.


Hmmm, bu zor bir tane. Klasik araba / bina / fabrika analojilerine pek iyi bir şekilde
çevrilemez

3
ABD ortak hukukunda Cumhuriyetçi ve Demokrat partiye atıfta bulunduğunu ve daha sonra üçüncü birini eklerken partilerin birini yeniden adlandırdığınızı hayal edin ... yasaların çoğunun yeniden yazılması gerekecek.
Meslek

Analoji ne anlama gelir: wikislerden, forumlardan vb. Anlamadığınız kopya yapıştırma kodu (güvensiz, hatalı yapılandırılmış vb.), E-posta eklerini (virüs, casus yazılım, spam vb. üçüncü kişiler?
Sakisk

@faif: Kopya yapıştırılan kodun mutlaka çöp kodu olması gerekmez. Yanındaki ofisteki adamın yazdığın kod iyi olabilir. Kopyalanan kodla ilgili sorun, çabucak yönetilemez bir bakım / hata ayıklama kabusu haline gelmesidir.
whatsisname,

1
@ faif: sonra parantez içindeki bölümü
zaplayın

Yanıtlar:


36

Bu gibi ... evinde bir saatin var. Harika! Saatin kaç olduğunu biliyorsun, ama her zaman o odaya bakmak zorundasın.

Ama elbette o odaya her zaman gitmeden saatin kaç olduğunu bilmek istersiniz, bu nedenle daha fazla saat alırsınız ve onları evinize dağıtırsınız. Bu saatlerin her biri bağımsızdır. Hepsi kendi zamanlarını korurlar. Bunun anlamı:

  • Gün ışığından yararlanma saati nedeniyle zaman değiştiğinde, hepsini değiştirmeniz gerekir.
  • Hepsi ayarlanmış olsalar bile, hepsi biraz farklıdır ve nadiren mükemmel şekilde anlaşırlar. Zamanla sürüklenirler.

Şimdi aynı sorunu düzinelerce veya yüzlerce saati olan büyük bir tesiste hayal edin. Bu nedenle , merkezi bir zaman dilimi ile senkronize kalmasını sağlayan ağ bağlantılı bir saat gibi bir şeye ihtiyacınız var . Bu şekilde zaman bir kez ve sadece bir kez tanımlanır .

Kopyala-yapıştır programlama daha bağımsız saatler satın almak gibidir. Ölçeklenmez.


1
Bu cevabı seçtim, çünkü genellikle içinde bulunduğum durumlar için en iyi sonuç olduğunu düşünüyorum - aradığım yazılımın çoğu hizmet sektöründeki insanlar için ve analojileri üretmek çoğu zaman bunları anlamakta zorlanıyor. Fakat hemen hemen herkesin evinde birden fazla saati var. Ayrıca hoşuma gidiyor, çünkü evinizdeki her bir saatin, zamanın değişip değiştirilmediğini açıklamanın bir yolu olarak (zamanın farklı / hızlı bir şekilde yavaş / yavaş olması) zamana göre farklı bir sürece sahip olduğunu da kullanabilirim. kopyala-yapıştır kodunun bakımı için bir seçenek değil.
EZ Hart

38

Bir uçak tasarladığınızı hayal edin. Tek motorlu jetin var. İyi satıyor. Şimdi okyanus boyunca uzun mesafeler için 4 motorlu uçak tasarlayacaksınız.

Şimdi, her bir motor için tam bir mühendislik spesifikasyonu ve çizimleri takımı oluşturmazsınız, değil mi? Hayır, aynı motoru dört yerde de kullanıyorsunuz. Şimdi 4 çiziminiz olup olmadığını ve bir şeyleri değiştirmek zorunda olduğunuzu hayal edin. Şimdi bunu dört motor çiziminde de değiştirmelisiniz. 4. motordaki bir şeyi değiştirmeyi unutursanız, aralıksız olduğunuz için ne olur?

Yani bir vidanın uzunluğunu veya boru dişini değiştirdiğinizi söyleyin. Artık mühendislik çizimleri veritabanında "arama ve değiştirme" yapamazsınız, yakıt pompalarındaki montaj vidalarını yanlışlıkla aynı boyutta olduklarından değiştirebilirsiniz. Veya kuyruk dümesine güç veren hidrolik hat aynı ipliği kullandı, ancak şimdi farklı ve artık kuyruğa güç veremiyorsunuz.

Şimdi NTSB'den sıkıldığınızı hayal edin çünkü motorlarınız Florida'nın güneyinde uçarken rasgele türbin kanatları atar ve patlar. Şimdi hangi motor çizimlerine bakıyorsunuz? Hepsi, biri? Dördünün de aynı olduğunu nereden biliyorsun? Belki de düzeltmeler yapıldı, ancak bunlar yalnızca birinciye uygulandı, çünkü motorları tasarlayan adam bir yıl geriye reggae grubuyla oynamak için ayrıldı ve dört motorun ayrı dosyalarda olduğunu hatırlayan tek kişi oydu. patlayan türbini düzelten adam onun yerine geçti.

Kodun kopyalanması ve yapıştırılması, ister vida isterse motor olsun, bileşen parçalarının çift çizimlerinin yapılmasına benzer. Bileşenleri mümkün olduğunca tekrar kullanılan temel parçalara soyutlamak istiyorsunuz.

Motorları kopyalamayın, sadece motorları kanala bağlayan kodu yazın.


11
Şimdi, 4 numaralı motorun diğer üç motordan farklı olduğunu hayal edin. Bu fark amaçlandı mı? Kalkıştan hemen sonra sola dönmenin neden olduğu belli bir tork sorununu giderecek şekilde mi tasarlandı? Yoksa kopyalamada bir hata mıydı?
David Thornley

5
Harika bir benzetme ... ama eğer birisi kopyala / yapıştır kodunu anlamakta zorlanıyorsa ... jet motorları da zor olabilir :)
Steven Evers

Bu benzetme için jet motorları yerine katı yakıtlı roketler hakkında konuşmalısınız. Bu şekilde, "Gördün mü? Tıpkı roket biliminde olduğu gibi" ile bitirebilirsin.
04:08

Bu bir benzetme değil. Planlar tam anlamıyla mekanik eserler için kod.
intuited

7

Aynı kaynağı tekrarlamak yerine aynı kaynağı paylaşmak açısından açıklamak zorundasınız.

Örneğin, büyük bir şehirdeki her evin elektrik sağlaması için özel bir elektrik santraline sahip olması mantıklı mıdır yoksa her evin aynı elektrik santralini paylaştığı daha mantıklı olur mu? Elektrik santrallerinde kullanılan belirli bir parçada bir şeyler ters giderse ve tamiratlar gerekliyse, tamiratları tek bir yerde yapmak kolaylaşır ve her biri tamiratlı her güç istasyonunda ve sadece her birinde tamirat yapmak yerine herkes bu tamiratlardan yararlanır evin bireysel faydaları.


7

"Hey bak bütün cerrahi biraz olan benzer Ben rastgele sakıncası olmaz bu yüzden ?, sağ kopyalamak cerrahi talimat operasyon için farklı cerrahlar farklı prosedürler için?"


1
Harika!!! Ameliyat bıçaklarla değil mi? Sana beyin ameliyatı yapmak için Kasap bıçağı kullanmama izin ver.
Aditya P

1
@AdityaGameProgrammer: Sahip olduğunuz tek alet bir kasap bıçağı olduğunda, her şey jambona benziyor.
Joey Adams,

6

Kopyala ve yapıştır, kalıpsız parçaları üretmeye çalışmak gibidir. Yavaş ve her parçadan bir defalık kullanım elde edersiniz, çünkü bir kez kusurlu veya bozuk olduğu tespit edildiğinde, kalıbın uygun bir yerine geçmesi için sabitlenemezsiniz.

Bir analoji arayışında, önce kopyala ve yapıştır programlamanın tehlikelerini göz önünde bulundurmalıyız :

  • Kopya tam olarak sığmadığından hatalar ortaya çıktı (gereksiz değişkenler ve kod yolları temizlenmedi)
  • Artan sınama gereksinimleri - soyutlama, yalnızca değiştirdiklerinizi sınarken regresyon sınama gereksinimini ortadan kaldırmanıza yardımcı olur ve dalları değil, yalnızca yaprakları değiştirirsiniz.
  • Çoğaltma her şeyi kopyalar, hatalar dahil. Her iki kod bölümü için de geçerli olan her bir hata düzeltmesi veya özelliği, şimdi uygulamak için iki kat daha pahalıdır ve tamamen unutulması olasılığı yüksektir.
  • Ara ve değiştir, kopyalanan kodu kolayca bulamadığınız için yukarıdaki sorunu daha da arttırır.

Kopyala ve yapıştır programlamaya karşı mücadelede ana silah soyutlamadır . Bu yüzden iyi bir benzetme bulmak için çevremizdeki dünyadaki soyutlama örneklerine bakın.

Soyutlama , tanımların belirlenmesi ve daha sonra bu tanımların uygulamada kullanılmasına devam etme fikrine dayanır. Tanımlar olmadan dünya nasıl olurdu?

  • Tanımlar hukuk dilinin kilit bir parçasıdır. Temel tanımı olmayan ancak her kullanımında her bir terimi tam olarak tanımlayan bir sözleşme düşünün.
  • Tanımlar ve şablonlar yapımında kullanılır. İnşaatta sık karşılaşılan bir sorun, başlangıçta alınan tek bir ölçüm yerine her sonuncuyu temel alarak her yeni kesimi yapmaktır. Bu, zaman içinde çılgınca değişen uzunluklara neden olabilir.
  • Şirket organizasyonu özet ve tanımlara dayanmaktadır. Ya şirketinizin her genişlemesi gerektiğinde, yeni rolü sıfırdan tanımlamaları gerekiyorsa? Bu işe yaramaz. Peki ya sadece benzer bir iş rolü seçmeye karar verirse ve onu uyacak şekilde hafifçe değiştirirse. Herkes yerlerine kilitlenecekti çünkü kaynakları hareket ettirmek imkansızdı.

Kopyalama yalnızca kopyalanan parça kalıcı olduğunda bir yere sahiptir. Aksi takdirde, her bir kopya ayrı bir şekilde test edilmesini, bakımını yapmasını ve geliştirilmesini sağlamak için tamamen yeni bir şube açar.

Soyutlama, tüm dalları bir tek gövdeye birleştirerek ve değişiklikleri daha küçük dallara ve hatta yapraklara izole ederek savaşır.


2
Küf benzetmesi hoşuma gidiyor, gerisi korkarım teknoloji dışı kullanıcılara pek yardımcı olmayacak.
Matthieu M.

@Matthieu - İlk mermi noktalarına atıfta bulunup bulunmadığınızı bilmiyorum, ama bunların analojiler olduğunu söylemedim, bir geliştiricinin iyi analojileri düşünmesi için düşünme sürecinin ne olduğunu düşündüğümü açıklıyordum.
Nicole

4

Sanırım kopya koddan bahsediyorsunuz, kopya yapıştırarak değil (parçacıkları ve benzerlerini kullanarak).

İşte çok iyi gösteren bir tarih kitabından bir benzetme. Gutenberg'in basından önce rahipler oturuyorlardı ve kitapları elle yazıyorlardı ve aynı kitabı tekrar tekrar yazıyorlardı. Rahiplerin yazdığı kitaplar çoğunlukla hatalarla doluydu ve Gutenberg sayesinde bu sorun giderildi.

Başka bir benzetme: para çekme makineleri. Çeşitli kartlara hizmet edebilecek ve her zaman onlara iyi hizmet edebilecek bir bankanız var. Yinelenen kod farklı para makineleri yaratır, böylece herkes farklı bir yere gitmek zorunda kalır ve bazen makine size bir BSOD bile verirdi.

Jeff'in kopya yapıştırması hakkında harika bir makale var http://www.codinghorror.com/blog/2009/04/a-modest-proposal-for-the-copy-and-paste-school-of-code-reuse. html

PS Gutenberg'den önce matbaa olduğunu biliyorum.


2

Programcı olmayanlara, iş adamlarından bahsettiğimizi farz ediyorum, bu yüzden kısa olur ve para gerçeklerini içeririm.

  1. Her kod satırı size maliyet getirir (yazılı veya kopyalanmış olsun)
  2. Her böcek size, her çizgiden çok daha pahalıya mal olur.
  3. Her kod satırı potansiyel hatalar ekler
  4. Çoğaltılmış kod = çoğaltılmış hata
  5. Çoğaltılmış hatalar neredeyse aynı test döngüsünde bulunmaz.

Kes ve yapıştır = Para Yazma.


1

Soruyu cevaplayamıyorum ama burada gerçekten bir analojiye ihtiyacınız olmadığını söyleyemem ve her gelişme deyimi veya düzeni için doğru analojiyi bulmaya çalışmak sapkın görünüyor ve çoğu zaman karşı üretkendir. Düz ayakla yoga yapmaya çalışmak gibi ...

Kopyala / yapıştır işleminin sorunlara neden olmasının birkaç nedeni vardır, mevcut böcekleri yeni yapıştırılan alanlara, eskiden performans artırımı olarak kabul edildiği bazı ortamlara yayar, aslında şimdi daha yavaş (eğer ilgilenen varsa örnekler sunabilirim) JIT'ye gelir ve siz de gerçekten modern bir derleyiciden daha akıllı olduğunuzu düşünüyor musunuz?).

Geliştiricinin tembel veya bencil veya her ikisini de gösterir. Eğer bu, şu anda bir takımda savaşıyorsanız, bu takımdaki pozisyonunuza bağlı olarak (takım lideri / jnr dev, snr dev, ne olursa olsun), muhtemelen kuruluşunuzdaki hakemlik tarafından düzeltilmesi için ihtiyacınız var.

EDIT: Aşağıdaki yorum ışığında, bu üçüncü taraf adına üçüncü taraf kodunu inceleyen koddur (ya da belki dördüncü taraf :) :) Umarım ekleyebileceğim bazı yararlı şeyler var.

İlk olarak, kod üçüncü taraf için üretildiğinde, herhangi bir ölçüm yapmaları mümkün mü? Örneğin Kod Satırı (LoC).

Hala yukarıda söylediklerimin hala önemli olduğunu düşünüyorum. Muhtemelen gözden geçirmenin amacının ne olduğunu da sormalıydım. Bunu sürdürmek için bir fiyat teklifi almak ya da değiştirmek için bir sürü farklı soru sormanız gerekiyor.

Her iki durumda da, kodun kalitesini değerlendiriyorsunuzdur, "Geliştirici soyutlama ve / veya program akış kontrol tasarımının yeterli şekilde anlaşıldığını gösterdi" kategorisine giren tüm yapıştırma kopyalarını kopyalayın:

Yorum: Geliştirici herhangi bir soyutlama anlayışı gösteremedi ve program akış kontrolüne yaklaşımları hatalara açıktı. Burada "Döngüsel karmaşıklığı" tanıtabilirsiniz. Aslında anlaşılması oldukça kolay ve bir turda bir cevap bulabileceğimi düşünüyorum: D Yay benim için.

Tamam Döngüsel karmaşıklık böyle. Bir haritan var. Başlangıç ​​pozisyonunuz ve olası her varış noktanız var. Çok olması gerekmiyor. Düşün, otopark, kafeterya, tuvalet. Siklomatik karmaşıklık, başlangıç ​​konumunuza herhangi bir varış noktasına ulaşmak için kullanabileceğiniz farklı rotaların bir ölçüsüdür.

Kopyalanıp yapıştırılan kod, muhtemelen döngüsel karmaşıklığı artıracaktır çünkü kendi adındaki bloğuna (veya yöntemine) soyutlanmış olabilecek tekrarlanan mantığı içerecektir.

Makul görünüyorsun?


Açık olmak gerekirse, bu diğer kuruluşların yazdığı koddur ve kuruluşumuza incelenmek üzere getirilmektedir. Bu benim organizasyonumdaki savaş değil, başka bir organizasyondaki insanları (programcı olmayanları) anlamasını sağlamak için ihtiyacım olan bir şey.
EZ Hart

Bunu bilmek faydalıdır ve umarım yararlı olmamı çok kolaylaştırır :) Bir düzenleme ekleyeceğim.
Ian

Üzgünüm, uzun düzenleme, ancak tldr'nin kopyalanıp yapıştırılan kod olduğunu düşünüyorum, kodlu bir kodlama kokusu olduğunu düşünüyorum (diğer şeylerin yanı sıra) siklomatik karmaşıklıkta bir artış olduğunu ve tek yönlü bir metafor kullanarak tarif etmek çok kolay.
Ian

1

Bir şey için İngilizce bir kelime al. Şimdi, o şeyi her tanımlamak istediğinizde, sadece kelime yerine tam sözlük tanımını kullandığınızı hayal edin. Başkalarının sizi anlaması ne kadar kolay olurdu?

Ben mevcut değil veya bu böyle değildir şeyin bir zihinsel görüntü oluşturması (hayal) o başka şartına bağlıdır bir eylem veya devlet belirten; İrade basit geçmişi. Geçmiş zamana göre fütüreliği gösterir. Geçmişte art arda veya yaygın olarak gerçekleşen bir eylemi belirtmek (bu) oldukça kolay olmazdı ; gerçekleştirmek veya anlamak ya da katlanmak için büyük fiziksel ya da zihinsel çaba gerektiren (zor).

Ayrıca, çoğaltmayı kaldırmak için yeniden düzenlenmiş olan gerçek kod örneğinden önce ve sonra bir gerçek göstermenin zararı olmaz.


Leslie Nielsen'in stilini sunmak için ikinci paragrafı prova etmenizi tavsiye ederim :-)
Karl Bielefeldt

1

Güvenlik ve kod bütünlüğü endişeleri de var.

Burada gösterildiği gibi, kötü amaçlı verileri panoya aktarılan unicode karakterlere gömmek mümkündür.

Editörünüzün unicode karakterlere nasıl cevap verdiğine bağlı olarak, kaynak kodunuzda, beklenmeyen derleyici çıktılarında veya henüz düşünmediğim bazı şeylerde beklenmeyen değişiklikler olabilir.


0

Burada giderken görebileceğim birkaç farklı rota var:

  1. İntihal - Bazıları fikri mülkiyet hırsızlığının büyük bir hayır-hayır olduğu okuldan hatırlayabilir. Kopyala-yapıştır programlama, birisinin kaynağını anlayamayacağı ya da ne aldığının ve bunun neden işe yarayıp yaramadığını anlayamadan analiz ederek, sadece kör kopyalanan ve yapıştırılan özel bir çözüm kullanmaktan gelebileceği gibi olabilir. soruna etkili bir çözüm.

  2. Körü körüne talimatları izliyor - Çoğu insan muhtemelen daha önce olmadığı bir yere gelmek zorunda kalıyordu. Bazıları bir yer bulmak için MapQuest veya Google Maps’i kullanmış ve verilen talimatları izlemiş olabilir. Yazılım, oraya nasıl gideceğinize dair özel talimatlar vermesine rağmen, nerede kaybolmaları gerektiğini ya da bulunmadıklarını bulmayan insanların hikayeleri olmuştur. Bu, kopyala-yapıştır işleminin diğer büyük tehlikesi, tıpkı birisinin size A'dan B'ye gitmek için yol tarifini vermesi gibi bir seyahatin biraz daha zorlanabileceği bir alanın haritasını görmenize izin vermemesi gibi olmasıdır. Bu zor görünmüyorsa, kişiden A'dan B'ye bir göz bağı takmasını istemesini isteyerek, hangi yöne bakacaklarını belirlemek ve bir hedefe ulaşmak için diğer duyulara güvenmelerini isteyin.

Veri, Bilgi, Bilgi ve Bilgelik , kopyala ve yapıştır işleminin çok mekanik olması ve aktarılan verilerin çok fazla düşünmemesi için çok fazla düşünmeden neden arama ve değiştirmenin bir çözüm olarak etkili olmadığını göstermek için referans verilebilecek iyi bir model olabilir. düzgün kullanma bilgisi ve bilgeliği olmadan. Biri nükleer enerjiye aradaki farkı anlamanın ne kadar güçlü olabileceğinin örnekleri için bakabilir. Güvenlik açısından bir nükleer bomba ile bir nükleer reaktöre kontrast verin ve atomun gücünü güvenli bir şekilde kullanmak için neyin nereye gittiğini bilmenin nasıl olduğunu görmek için kullanın.


0

Bir grup öğrenciniz ve okul için bir takım kurallarınızın olduğunu hayal edin. Kuralları ortak bir yere göndermek yerine, tüm öğrencilerin size kuralların birer kopyasını vermeleri gerekir. Her öğrenciye kuralların kopyasını mektuba uymaları gerektiği söylenir.

Şimdi bir felaket durumunda, yeni felaket sığınağına gitmeniz gerektiğini söyleyen kurallardan birini değiştirin. Her öğrenciye gitmeli ve kurallarını değiştirmelisiniz. Eğer öğrencilerden biri kaçırılırsa ve bir kasırga vurursa, öğrenci eski yerine gidip korkunç bir ölümle ölür.


0

Birisi size ekli bir belge şablonuna sahip bir e-posta gönderir. Şablon değişinceye kadar kullanmaya devam etmekten çekinmeyin. Endişelenmeyin, size tazelenmiş bir kopya göndermeyi unutmayacaklar.


0

CoCoMo maliyet modeli.

http://en.wikipedia.org/wiki/COCOMO

Uygulanan Çaba (E) = a * (KLOC) ** b, burada b> 1.0

Bu üs , kod satırlarının sayısından daha hızlı büyümesi / sürdürülmesi / desteklenmesi / yeniden yazılması çabası anlamına gelir .


0

Bu kötü uygulama için henüz kimsenin göz önünde bulundurmadığı başka önemli bir husus daha var: Bir başkasının ( izinsiz ) bir kodunu (tam veya kısmi) körce kopyalayarak ( izinleri olmadan ) telif hakkı yasalarını çiğniyor olabilirsiniz .


0

Gördüğüm kopyala yapıştır kodlama, geliştiricinin ne yaptığını anlamadığı ya da nedenini düşünmek istediği ve son olarak rastgele onları çırparak, ihtiyaç duydukları şeyi "az ya da çok" yapan farklı parçaları bir araya getirerek kopyalıyor Onları birbirine sığdırmak için.

Bununla ilgili üç ana problem var:

  1. Asla hatasız kodla sonuçlanmaz. Hiç.
  2. Kodu yazarken anlamadılarsa, hata ayıklama sırasında asla çözemediler. Sadece bir başkası, ek ücret karşılığında yaptıkları pisliği temizleyebilir.
  3. Yazdıkları kod hakkında düşünmekten kaçınırlarsa, öğrenmekten kaçınırlar. Öğrenmekten kaçınırlarsa, asla iyi bir programcı olamazlar. Asla iyi bir programcı olmayacaklarsa, neden takımdalar?

0

Diyelim ki 5 kız arkadaşın var (seni kurnaz köpek) ve hepsini bir sevgiliye mesaj göndermek istiyorsun. İlk mektubu yazarsın, ismini ekler ve paylaştığınız unutulmaz bir şeyden bahsedersiniz. Daha sonra harfi dört kez kopyalayıp yapıştırın, her seferinde bir yazım hatası yaptığınız için her zaman # 1 adının bir kopyasını kopyalayıp yapıştırın. Şimdi, beş kız arkadaşından 4 tanesi 1 numaralı kız arkadaşının evine gidiyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.