פרקטיקה ומתמטיקה: הזמנה לדיון
טוב, לפני הכל רוצו לקרוא (או לפחות לפתוח בטאב נפרד) את הפוסט המצויין של גדי אלכסנדרוביץ’ ממנו נשאבה הכותרת לפוסט הזה (וכשאתם שם עשו לעצמכם טובה גדולה והוסיפו אותו לקורא הרסס שלכם).
הקדמה אישית קלה
כשלמדתי מדעי המחשב בתואר ראשון (כחוג משני בלבד) הרגשתי מרומה. אחרי הקנייה של כישורי תכנות בסיסיים ושל בסיס מתמטי ראוי עברנו לקורסים תיאורטיים במימוש אלגוריתמים. כצעיר נסער שחלם בינה מלאכותית ומציאות וירטואלית התאכזבתי מהעיסוק האובססיבי והקטנוני כל כך בוריאציות מורכבות עם הבדלים מינוריים במיון וחיפוש של נתונים. האינטרנט, ראוי לציין, היה אז בגדר שמועה שחלחלה אלינו במהלך הלימודים.
אבל אז הגיע המפץ הגדול של האינטרנט (להבדיל מהתפוצצות הבועה של האינטרנט שתגיע קצת אחר כך) ופתאום התברר עד כמה חשובים כל האלגוריתמים האפרוריים האלה.
יחד עם אותו מפץ גדול נוצר צורך דחוף במתכנתים, ויחד עם הצורך הזה גם שינוי עמוק למדי בהגדרת הדרישות ממתכנת. שינוי שאני מבקש לתהות קצת לגבי ההשלכות שלו כאן.
דיסקליימר קצרצר
השאלה העומדת בבסיס הפוסט הזה עלתה בראשי בעודי מגלגל בו טיוטה לפוסט אחר לחלוטין על מודל החינם של כריס אנדרסון (במהרה בקרוב בימינו אנו) והתחדדה עם הקריאה בפוסט המצויין של אלכסנדרוביץ’. לפני שאציג אותה אני חייב להתוודות שהיכרותי עם תחום התכנות ופיתוח האתרים היא שטחית למדי, מתבססת על שיחות חטופות ועל נסיונות אמיצים אך נואשים וכושלים לנבור בקרבי הקוד של כמה תוספים בבלוג שלי. בהחלט ייתכן שאני טועה בתחושת הבטן שלי ואשמח לשמוע על כך בתגובות.
הזמנה לדיון
בואו ניקח את וורדפרס כמשל.
MySQL אני משוכנע בלב שלם, ממומש בצורה חכמה ויעילה להפליא.
גם וורדפרס אני נוטה (ורוצה) להאמין נכתבה כך שתשתמש בפונקציות של MySQL בצורה חכמה.
אבל אז מגיעים התוספים.
(מקור: Wikimedia Commons)
כל מי שביקש אי-פעם לשכלל מעט את בלוג הוורדפרס העצמאי שלו נתקל ברשימה האינסופית כמעט של תוספים העומדים לבחירתו. התוספים האלה, באופן טבעי, נכתבו על-ידי משתמשי וורדפרס אחרים, כדי לממש מגוון פונקציות שאינן קיימות בהתקנת הוורדפרס הבסיסית. חלקם, יש להניח, נכתבו בתשומת לב ותוך הקפדה על מימוש יעיל. אחרים מומשו בצורה נאיבית. בלוג וורדפרס ממוצע אינו מכיל יותר מכמה מאות רשומות, ולכן גם גישה נאיבית מאוד למימוש האלגוריתם של תוסף תתבטא בזמן ריצה זניח כמעט עבור הקורא שממתין לטעינה של הבלוג על המסך שלו.
אבל אם ניקח את שבריר זמן העיבוד המיותר הזה שנוצר בגלל מימוש נאיבי ונכפול אותו במספר הטעינות של אותו בלוג ואז במספר הבלוגים שמשתמשים באותו תוסף נקבל בזבוז מפחיד של כוח עיבוד, בזבוז שיתבטא בסופו של דבר, למשל, במותם המואץ של שרתים, ובפליטה מוגברת של חום לסביבה.
מה שנכון לגבי וורדפרס ותוספיה נכון באותה מידה לגבי פייסבוק ואפליקציות חיצוניות, נכון לגבי הרבה מאוד אתרים קטנים ובינוניים שפותחו על-ידי דור של מתכנתים שאולי יודע היטב להתמודד עם תאימות לשלוש גירסאות שונות של ארבעה דפדפנים אבל עבורו מלים כמו סיבוכיות הן מסתורין בתוך חידה אפופת תעלומה.
אני לא בטוח, כאמור, שהתיאור שנתתי כאן הוא מדוייק. בהחלט יכול להיות שהוא מוגזם.
גם אם הוא נכון קשה לי לראות דרך לצאת מהמלכוד שהוא מסמן.
אבל כמו שכבר אמרתי זו רק הזמנה לדיון.
קדימה.
(שחר כותב בדרך כלל בבלוג “תודעה כוזבת“, טוב, לא כל כך בדרך כלל לאחרונה, אבל בעקרון) >















23.07.2009 בשעה 18:17
אז מה השאלה?
23.07.2009 בשעה 18:57
בעצם זה המשך של אותה הבעיה עם התפתחות החומרה של מחשבים. אם לפני עשרים ושלושים שנה כתיבה והרצה של תוכנית קטנה ארכו שעות רבות וכל חסכון במשאבים הי נדרש, אזי כיום חלק גדול מאוד מהתוכניות כתובות באופן בזבזני במשאבי חישוב. זה קורה ברשת, בתוך הקרביים של המחשב האישי וכנראה בכל מקום ממוחשב שהוא.
23.07.2009 בשעה 20:05
אני חושש שאיראה רע אם אתחיל את התגובה שלי במילים “כשאני התחלתי לתכנת”, בעיקר כי אני בשנות העשרים שלי ואבא שלי יצחק עליי כל-כך שלא יהיה לי נעים לצאת מהחדר אחרי זה (התחלתי לתכנת בבייסיק [וספגתי הרבה הערות על פקודות ה-goto שהספר ממנו למדתי השתמש בהן] בשנות ה-90, אבא שלי עוד זוכר את הניירות המחורצים ואת התורים למחשבים כדי להריץ את “התוכנה”), אבל גם מכיוון שהגעתי למקום שבו אני באמת לומד לתכנת וגיליתי שאני לא באמת יודע לעשות זאת (לפחות לא כפי שחשבתי שאני יודע)
רכיבים זולים וזמינים הפכו את ההתחשבות במגבלות ואת היעילות לשיקולים מיותרים – למי אכפת אם התוכנה שלך לא מחזירה את כל הזכרון בסוף הפעולה, יש לך מעל 9000 מגהבייטים פנויים של זכרון ואתה לעולם לא תרגיש בהבדל.
23.07.2009 בשעה 20:27
בדרך כלל, מערכות מקצועיות טוענות את כל הפונקציונאלית לזיכרון פעם אחת (למשל כשהמערכת עולה, או בפעם הראשונה שמשתמשים בה), ומארגנת אותה כך שיהיה לה קל לאתר אותה שוב – למשל בטבלה. ואז, בכל פעם שמישהו צריך את היכולת הזו היא כבר שם.
היי! – אולי בכל זאת מצאנו מה לעשות עם הטבלה של איציק!
23.07.2009 בשעה 20:55
בוריס,
אתה עושה את אותה טעות שגרמה לגרמה לפוסט שגרם לפוסט הזה (תקרא את הפוסט של גדי).
אתה מניח שבגלל שהיום מחשבים ממש מהירים, ושיש להם ממש הרבה זכרון – זה כבר לא חשוב לכתוב קוד יעיל וחסכוני בזכרון.
אולי זה יעבוד בפרוייקטי צעצוע, אבל ברגע שכמות הקלט גדלה קצת, פתאום ההבדל בין זמן ריצה ריבועי לזמן ריצה לינארי מרים את הראש.
23.07.2009 בשעה 20:59
טוב, התגובה הקודמת שלי באמת לא ברורה דיה (האם טוויטר הופך אותי ללקוני יותר מהרגיל?), אז אפרט קצת יותר.
שאלת הפרקטיקה מול המתמטיקה היתה באמת באוויר בזמן הלימודים, אבל מבחינתי היא די מתפוגגת ברגע שיוצאים לעולם ומשתפשפים קצת במקצוע. אולי בגלל זה השאלה נראית לי כבר קצת לא רלוונטית. יש אמנם הרבה ז’אנרים ותתי-ז’אנרים של תכנות ושל מתכנתים. אבל ברובם המכריע, כדי להיות טוב במה שאתה עושה אתה צריך בסיס של הבנה תיאורטית שתמנע ממך טעויות קטנות טיפשיות שיהפכו להיות הרסניות.
זה לא אומר כמובן שאת הידע הזה אפשר לרכוש רק באוניברסיטה. אפשר גם לבד, אפשר מתוך ניסיון, יש הרבה אופציות. כדי להיות מתכנת טוב לא צריך בהכרח לדעת להוכיח בעיות של NP complete אבל כן צריך לדעת מה זאת סיבוכיות, איך היא משפיעה על אופי של פתרונות, מהם שיקולים של יעילות.
יש תחומים מצומצמים שבהם “מתכנתי כפיים” יכולים להספיק. אבל ברגע שמדובר במערכות שיש להן פוטנציאל גדילה צריך אנשים שיודעים מה הם עושים.
מתכנת טוב צריך כישורים וידע של מתכנת טוב. ואלה כוללים גם רקע תיאורטי. אז אני לא רואה פה כל כך שאלה של פרקטיקה מול מתמטיקה. אם כבר, אולי זו שאלה ספציפית של מינון במהלך הלימודים. אבל האם זו השאלה?
23.07.2009 בשעה 21:05
הכל למעשה תלוי במה אנחנו מעונינים להשיג. אם המטרה היא בלוג או אפילו אתר אינטרנט קצת יותר משוכלל, ברב המקרים עדיף להגיע מהר מאוד למשהו עובד ולשפר אח”כ (לפני פיצוץ הבועה קראו לזה time to market ). אבל אם המערכת שלנו מיועדת לשוק אחר (כן, יש תחומים בהייטק שהם לא אינטרנט) או עובדת בהיקף גדול יותר מאוד חשוב שהתוכנה שלך תחזיר את הזכרון בסוף הפעולה וכדאי גם שתעשה זאת בדרך יעילה. בדטה בייסים זה מאוד בולט. כל אחד יכול לכתוב SQL בסיסי שעושה את העבודה אבל עד שלא תבחין בהבדל בין שאילתה אופטימלית לזאת שרק עושה את העבודה לא תבין.אם עובדים בקצב של אלפי טרנזקציות בשניה, שאילתה לא אופטימלית או דליפה הכי קטנה הופכות מהר מאוד לבעיה גדולה.
האמת היא שללא כל ספק, “מימוש נאיבי” כמו שקראת לזה מתוגמל בימים אלו הרבה יותר. תמיד יעדיפו את התוכניתן שמסוגל ליצר אפליקציה בדקות על הנודניק הזה שחושב שעות על כל דבר ומקשקש כל מיני מילים שאף אחד לא מבין.
23.07.2009 בשעה 21:06
עמרי, אני מתנצל אם הניסוח שלי לא היה ברור.
מה שניסיתי (וכנראה ללא הצלחה) לומר היה שמכיוון שככה (כפי שהבנת שאני חושב) אנשים חושבים כיום, אז גם הקוד שלהם נראה בהתאם. לצורך העניין אני שמח שבאחד הקורסים הקרובים שאקח יכריחו אותי להתחשב בכל ביט זכרון שלא שחררתי בסיום הפעולה. אולי לא איהנה מן התהליך, אבל ארכוש כישורים שנזנחים כיום בשל אותה טעות שגם גדי, וגם גל וגם אתה הזכרתם (וטכנית גם אני, אבל כאמור, נראה שזה לא היה ברור מדבריי – אשתדל להבא לנסח את עצמי טוב יותר).
מכיוון שהמחשבים היום ממש מהירים ויש להם ממש הרבה זכרון, אנשים רבים זנחו את הדאגה ליעילות. (לנו עשו הדגמה של חיפוש בינארי אל מול מעבר על שורה שלמה מבחינת זמן הריצה וזה הספיק לרובנו להבין את הצורך ביעילות).
23.07.2009 בשעה 22:27
אני לא בטוח שההנחה שלך לגבי Wordpress נכונה.
בתור התחלה המעבד אינו בהכרח צוואר הבקבוק. ישנו גם עניין של IO בגישה למסד הנתונים, לדוגמה.
ר’ לדוגמה:
http://art-blog.no-ip.info/newpress/blog/post/141
ובכלל דברים אחרים שהוא כתב. כצפוי מישהו שמחליט בדעה צלולה לכתוב מערכת ניהול תוכן ב־C++ אינו לגמרי שפוי, אבל מי שגם מצליח לעשות את זה חייב להיות יסודי. יש אצלו לא מעט מידע על הביצועים של רכיבים רלוונטיים.
BoR|S: חשוב לדעת לכתוב קוד יעיל. אבל כדאי לדעת איפה לא שווה להשקיע את הזמן בכתיבת קוד יעיל. קוד נכון וקוד קריא הם דברים חשובים בערך באותה מידה. בקוד לא נכון יש באגים. בקוד לא קריא יותר קשה למצוא את בעיות הביצועים והבאגים.
23.07.2009 בשעה 23:49
תראה, יש הבדלים בין מתכנתים, ואני לפעמים מזועזע מדברים שאני מוצא בקוד בקטע של יעילות, שימוש במבני נתונים לא נכונים, שאילתות בנויות עקום בדטהבייס ועוד דברים נוראיים.
אבל זו לא הנקודה. הפלאגינים הם הכוח של וורדפרס, כמו שהאקסטנשנז הם הכוח של פיירפוקס, כמו שגדודי המפתחים שעובדים על הקרנל הם הכוח של לינוקס. ברור שיהיו הבדלים ברמה של המתכנתים והתוצאה, וזה בסדר. השאלה היא איך מבדילים, במיוחד כשמשתמש הקצה הוא ממש לא טכנלוגי. אני נגיד יכול להסתכל על פלאגין לוורדפרס ולדעת מיד אם הוא קקה או לא, אבל זה כמובן לא הכלל.
בלינוקס יושבים לינוס טורוולדס והחבר’ה שלו, וצורחים ומקללים כל מי שמביא עבודה לא מספיק טובה בתור פאץ’ לקרנל. מי שרוצה סטמפה שזה קרנל שעבר בקרה – יוריד את הקרנל הרשמי והיציב. מי שרוצה להתקין שטויות – שיתכבד.
אם היתה מערכת כזו (אולי יש ואני לא מכיר) גם לאפליקציות כמו וורדפרס, זה היה נחמד.
אבל סה”כ, אני חושב שהתועלת במערכת פלאגינים פתוחה גדולה מהנזק, עובדה שגם וורדפרס וגם פיירפוקס עם הצלחות היסטריות בזכרות זה. אני אישית מאוד זהיר עם מה שאני מכניס לפיירפוקס ולבלוג שלי.
24.07.2009 בשעה 0:12
צפריר, ההערה היחידה שקיבלתי אי פעם על שיעורי בית בתכנות הייתה בקשה לתעד פחות
(אבל אני רק בתחילת התואר שלי – ככה שייתכן וחלק זה בתגובה יהיה ללא רלוונטי במיוחד בעתיד)
אני לא בטוח שאני מסכים איתך. כאשר אתה כותב קוד שישוחרר תחת רשיון שימוש חופשי, אתה לא יכול לדעת מראש איזה שימוש ייעשה בספריה או בקטע קוד שלך. ייתכן מאוד שדורות של מתכנתים יקללו בעתיד על כך שכתבת קוד מאוד קצר, אבל לאו דווקא היעיל ביותר.
24.07.2009 בשעה 8:47
טוב, יצא שהצטברו כאן לא מעט תגובות עד שיצא לי להגיב בעצמי.
אתחיל מהבהרה למרגוליס: הדיון שניסיתי לפתוח כאן מתחלק לשניים – ראשית אני תוהה כפי שכבר כתבתי עד כמה ההתרשמות שלי, שמבוססת על היכרות עם כמה מתכנתי ווב ועם שגרת העבודה שלהם נכונה בכלל. שנית, וחשוב יותר לטעמי, בהנחה שהתיאור אינו חוטא לאמת בצורה גסה (כפי שמסתמן כאן) האם יש מקום לדאגה, והאם יש משהו שאפשר לעשות?
תגובה כללית שנוגעת לחלק ניכר ממה שנאמר כאן: אני חושב שההיתלות בהתקדמות של חומרה (בראש ובראשונה) ושל תוכנה (למשל קיומם של אלגוריתמים מוצלחים לדחיסה שיחסכו רוחב פס) היא נכונה רק עד לגבול מסויים, ובניגוד למה שאולי נראה במבט חטוף הגבול הזה אינו רחוק מאיתנו. זה בעצם הרעיון הבסיסי של הפוסט המשתהה שלי על מודל החינם ועל הכשל המרכזי שלו. משימות שבעבר היו צרכניות משאבים כבדות הופכות לזניחות היום, אבל כך היה מאז ומעולם, ותחומים טכנולוגיים מתקדמים על-ידי ניצול מרבי של המשאבים כך שנוכל לבצע משימות שהיו בלתי-אפשריות בעבר, לא על-ידי הסתפקות בכך שקל יותר לבצע את אותן משימות ישנות.
שוב, מרגוליס: קטונתי מלהתערב בתכניות הלימודים האקדמיות, מה גם שלחלוטין לא ברור לי איך הן נראות היום (הפעם האחרונה שבה למדתי מדעי המחשב היתה ב-98′) ואני מניח שבעלי תואר אקדמי מצויידים בכלים הנכונים גם אם התמהיל המדוייק של פרקטיקה ומתמטיקה ראוי להישקל מחדש. הבעיה שלי, והיא מתמקדת בעיקר בתחום הווב כמובן, היא הצפה של השוק במתכנתים שכמעט ואינם מודעים לשיקולים המתמטיים, ובעלות העצומה והכמעט בלתי-נראית של מתכנתים כאלה שמתבטאת בזמני ריצה מנופחים, ברוחב פס מבוזבז ובזכרון מיותר (לכל אלה יש גם ביטוי כספי בסופו של דבר).
ובהמשך ישיר, טל: בתחום הנדל”ן יש תופעה מוכרת שבה קבלנים מתקינים מזגן בדירה כדי שתהיה אטרקטיבית יותר, אבל, באופן מובן מאליו, הם לא מעוניינים להוציא עליו הרבה כסף. התוצאה: שנה אחרי הקנייה הדיירים “מחזירים” את כל מה שחסכו באמצעות חשבון חשמל מנופח. זה, לתחושתי, קרוב מאוד למה שקורה בתחום הווב, כשאתה מסתפק במימוש נאיבי (יותר נכון היה לכתוב brute force) אני משער, ואז נאלץ, למשל, לשלם על חבילת אכסון יקרה יותר בלי לדעת את הסיבה.
בהרבה מאוד תחומים, כמו שציינת, אין בעיה כזו כיוון שברור שמי שמופקד על אלגוריתמים צריך להיות מצויד בידע מתאים. אחרים (“מתכנתי כפיים” כמו שמרגוליס קרא להם) יולים להיות מופקדים על משימות צדדיות. בתחום הווב נראה לי שההפרדה הזו מטושטשת עד לא קיימת.
צפריר: ההיכרות שלי די מצומצמת, כאמור. בכל מקרה, כשאני מדבר על”זמן עיבוד” אני לא מתכוון רק לסיבוכיות תיאורטית של מימוש האלגוריתם, ומובן שניתוח אמיתי צריך להתייחס גם לפעולות IO בנפרד. גם שם, כמובן, ואולי ביתר שאת, חשוב שמתכנתים יבינו מה הם עושים ולא יהיו בזבזניים.
בכל מקרה, הנתונים בקישור שהבאת די מדהימים.
דביר: אין ספק שאתה נוגע באחת הבעיות המרכזיות. ודאי שאני מעדיף מצב שבו יש תוסף מוכן כמעט לכל גחמה שלי על מצב שבו הכל עובר דרך איזה “מכון תקנים” לפני שחרור. ועדיין חייבים לתהות האם אין דרך אחרת? טוב שיש קהילה פעילה של משתמשי וורדפרס וטוב שיש גישה לכל התוספים, אבל אולי אפשר למצוא איזו דרך להתריע בפני משתמשים פוטנציאליים על מימוש בעייתי. לא יודע.
בוריס: מעניין שבשלב מסויים שקלתי לכתוב בפוסט שאני מדבר על מתכנתים שעבורם “פתרון אלגנטי” משמעו מינימום של שורות קוד במקום “מינימום של דרישת משאבים לביצוע המשימה”. אני שמח לקרוא את התגובות שלך, בעיקר כי הן שונות באופן די קיצוני מתגובות ששמעתי בעבר ממתכנתים פעילים (שוב, רק בתחום הווב) שפשוט לא רצו לשמוע שאלות על נושאים כאלה ופטרו אותן כשטויות.
24.07.2009 בשעה 11:01
תחום הווב באמת היה המערב הפרוע של התכנות – כל מי שהצליח לשלוף מקלדת נהיה בונה אתרים. אבל נראה לי שזה היה בעיקר סימפטום ילדות. ככל שהתחום מתבגר ומתמקצע אנשים מבינים שכדי להרים משהו קצת יותר רציני מאתר צדדי צריך כבר להבין מה אתה עושה. וגם המשברים הכלכליים עוזרים לנפות את האנשים הפחות מקצועיים. לא שזה ימנע קוד מחורבן ומבזבז משאבים, כזה תמיד יהיה כמו שתמיד יהיו מזגנים שזוללים חשמל בלי לעשות איתו משהו מועיל, אבל נראה לי שהבסיס הוא מקצועי יותר.
ומצד שני, תוך כדי ההקלדה, אני נזכר גם בכל התחזיות שתכנות, לפחות ברמתו הוובית הבסיסית, יהפוך לכישור נפוץ בדורות הבאים. ובאמת, כי ילד במייספייס יודע לשחק קצת ב HTML בשביל לשפצר את הפרופיל. אולי אלו לא תחזיות מופרכות כל כך. אני מניח שסוג כזה של תכנות יתבצע ברמות אבסטרקציה גבוהות. בתקווה, התשתית תהיה חכמה מספיק כדי להתמודד עם חוסר נסיון או ידע.
24.07.2009 בשעה 13:05
מרגוליס: מעניין לציין שזו אחת הבעיות שפריימוורקי הווב של השנים האחרונות מנסים לפתור. אותי אישית, דווקא בגלל שהם מנסים להסתיר מהמתכנת את הקרביים המלוכלכים של האפליקציה, הם קצת מרתיעים. אני עובד על פרוייקטי PHP עם פריימוורק ORM קטן שאני פיתחתי בעצמי שנותן לי את מרב השליטה.
25.07.2009 בשעה 11:10
אתה מתעלם מהשיקול החשוב של זמן התכנות. בתחום האינטרנט (אבל לא רק שם. תחשוב כמה זמן משקיעים בכתיבת התוכנה שיושבת על הנתב הקטן שנמצא אצלך בבית: כל כמה זמן יוצא דגם חדש?) חשוב במקרים רבים לכתוב תוכנה מהר.
כמוכן יש הבדל בין “מספיק טוב” לבין “טוב”.
טוב, ברחתי. הנצנוצים מפריעים לי.
26.07.2009 בשעה 9:08
מרגוליס, דביר: מעניין מה שאתם מדברים עליו. אני דווקא בהחלט חושב שאפשר לדמיין מערכת קצת יותר גמישה מוורדפרס במתכונת הנוכחית, כך שהאפשרויות לבצע התאמה שלה לצרכים שונים תוטמע לתוכה באופן חכם יותר, כך שמצד אחד קל יהיה יותר לכתוב תוספים ומצד שני התוספים ימומשו בצורה חכמה יותר.
אבל אולי אני הוזה.
צפריר: אני לא מתעלם, אבל כמו שאמרתי, ההיכרות שלי עם התחום היא קצת חלשה. אני בהחלט יכול להבין את שיקול המהירות בהרבה מקרים, אבל בכלל לא בטוח שזה השיקול המרכזי שגורם לשחרור של קוד בעייתי לחלל הרשת.
07.08.2009 בשעה 2:07
שחר,
אני לא כל כך מבין על מה ממוקד הדיון. כן, מתכנתים של תוספים שמשתמשים במימושים נאיביים מבזבזים זמן עיבוד (ומימושים לא אופטימליים יכולים להתבטא גם בגישות יותר רבות למסד הנתונים, כך שאי אפשר לומר שכיוון שהמעבד הוא לא צוואר בקבוק אז הכל בסדר). אבל אני לא חושב שמישהו יתנגד לטענה הזו, ולכן זה כנראה לא מוקד הדיון.
מה כן? השאלה של מה אפשר לעשות נגד זה? ביקורת תוספים? די קשה לנתח קוד, גם בצורה ידנית ובטח בצורה אוטומטית. ודאי שהיה טוב אם המתכנתים היו מקבלים הכשרה תיאורטית מתאימה, אבל אין דרך להכריח אותם.
בכלל, האם צריך להתלונן גם על האנשים שמעלים סרטונים לא מעניינים ליוטיוב, או כותבים אתרים מיותרים? ה”חינם” של האינטרנט לרוב (לא תמיד!) מוביל לעבודה יותר חובבנית. מי שבחר בבזאר על פני הקתדרלה, שלא יתפלא כשנופלת לידיו סחורה מזויפת.