ToCode
Open in Telegram
1 419
Subscribers
-124 hours
+27 days
+130 days
Posts Archive
1 420
# גם תיעוד גרוע הוא הזדמנות למידה
״הכלי מעולה אבל התיעוד לוקה בחסר״
״לקח לי יותר משעה למצוא דוגמא נורמלית שעובדת״
״אני מנסה ללמוד דג'נגו והתיעוד רץ ב 100 קמ"ש ובלי שום תמונות״
אני יודע שזה מתסכל להתחיל לקרוא תיעוד על ספריה ולא להבין כלום. זה קרה לי עם NumPy וגם עם Active Records בהתחלה וכמובן בכל מה שקשור ל CSS. הבעיה היא אף פעם לא היעדר תיעוד (אף אחד לא מתלונן על תיעוד ה API של iCount), אלא ספריות עם תיעוד ארוך, קיים, שאני פשוט לא מבין אותו.
וזה מכעיס כי מתכנתת חכמה ישבה שם וכתבה את כל התיעוד הזה, וחשבה על כל מקרי הקצה האפשריים ותיעדה גם אותם בפירוט מטריד - ואני קורא ולא מבין כלום. ומה כבר רציתי? דוגמא פשוטה שתסביר איך לעשות את הדבר הזה שאני צריך לעשות.
והנה הבעיה האמיתית: כשהתיעוד קיים, כתוב, ואתה לא מבין אותו זה אומר שהתיעוד נכתב לאנשים אחרים. נכתב למתכנתים שיש להם עולם תוכן ועולם מושגים מסוים שלך עדיין אין. הרבה אנשים שינסו לקרוא את ה Man Pages של יוניקס בשבועות הראשונים שרק נחשפו למערכת ירגישו שהם כתובים רע, שאי אפשר להבין מהם כלום או למצוא בהם כלום. אבל הרבה אנשים מנוסים מרגישים את ההיפך לגבי אותו Man Page ממש. התיעוד מפורט, ברור ומדויק אם אתה יודע לקרוא אותו, ונראה כמו סינית כשחסרים לך מושגים בסיסיים בעולם התוכן הרלוונטי, מושגים שבכלל לא קשורים לתיעוד של הספריה הספציפית אותה אתה מנסה ללמוד.
רוב המתכנתים כשמתמודדים עם מצבים כאלה יחפשו איזה Tutorial פשוט שרק ייתן להם את הדוגמא הראשונה וימשיכו משם, וזה בסדר, אבל חשוב לא לעצור שם. התיעוד הלא ברור בעצם אומר לך משהו, הוא אומר לך שאתה לא שם, שחסרים לך מושגים בסיסיים בעולם התוכן שהספריה הזאת פועלת בו. מתכנתים טובים מבינים את ההזדמנות ולוקחים צעד אחורה במטרה ללמוד איך לקרוא את התיעוד. כי רק כשאתם יודעים מספיק בשביל לקרוא את התיעוד אתם יודעים מספיק בשביל להשתמש בצורה חכמה בכלי שעל הפרק.
1 420
# ניטרול מנגנוני הגנה
בהודעה מפורסמת ב Stack Overflow מ 2011 אחד הגולשים שאל איך לשתף Session Cookie בין ASP.NET ל Java Applet. התשובה עם ה-וי שם המליצה לו לנטרל את מנגנון ההגנה שנקרא HTTP Only Cookie. זאת ההתכתבות:
https://stackoverflow.com/questions/201699/sharing-asp-net-session-cookies-with-a-java-applet/656465
העצה עובדת אבל המחיר אני חושב גדול מהתועלת. ניטרול מנגנוני הגנה בלי לבנות מנגנון אחר במקומם הוא רעיון רע: בסיטואציה כמו שתוארה מנגנון ההגנה שנקרא HTTP Only Cookie אמור לשמור על הגולש ממתקפת XSS שתגנוב לו את ה Session Token.
יותר גרוע - לאט לאט מערכות גדלות, אנשים מעתיקים קוד ממקום למקום ומנגנוני הגנה שמנוטרלים לא חוזרים לפעול. מתכנתים מתרגלים לחיות בלי מנגנוני ההגנה האלה ומערכות הופכות לפחות מאובטחות.
תשובות מסוג זה הן חלק מהסיבה שאי אפשר להשאיר את עולם אבטחת המידע רק ל Pen Testers וכלים אוטומטיים. אנחנו חייבים להכיר את בעיות אבטחת המידע שאנחנו עשויים להיתקל בהן, ואת מנגנוני ההגנה שיש לנו כדי שלא ננטרל בטעות מנגנונים שנמצאים שם מסיבה טובה.
1 420
# בורח להרים
כל פעם שאני ניגש להתכונן להרצאה על נושא שאני לא הכי מכיר אני עובר פחות או יותר את אותם שלבים ביחס שלי כלפי נושא ההרצאה:
1. הכי קל בעולם - זה הכל? אין פה כלום מתחת. איך אפשר לדבר שעה על זה?
2. אה רגע זה מעניין, למה הם כתבו כאן את הפונקציה הזאת ולא את ההיא?
3. מה הולך פה?! איך לא ראיתי את כל ערימת התיעוד הזאת עד עכשיו? אין מצב שאצליח ללמוד את כל זה בחודשיים (או אפילו בשנתיים)... חייב לברוח להרים.
4. אה ככה זה עובד. עכשיו אני מבין. בעצם זה לא כזה שונה מהדבר ההוא שאני כבר מכיר.
5. נחמד! איזה יופי שהם חשבו גם על הטריק הזה... אני מתחיל לאהוב את הטכנולוגיה הזאת.
6. יצאה אחלה מצגת. אני שמח שלקחתי את הפרויקט הזה ולא ברחתי להרים.
והדבר המדהים כאן הוא שהפחד והרצון לברוח להרים לא נעלם, גם אחרי אלף מצגות. באנגלית יש משפט "The only way out is through". אז נסו גם אתם לרוץ בתוך ולא לברוח להרים. ואם אתם ממש חייבים לברוח אז לפחות קחו משהו לשמוע בדרך:
<iframe width="560" height="315" src="https://www.youtube.com/embed/y2lpR-mlQTw" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
1 420
# ומה אם?
הנה טכניקה פשוטה שכמעט תמיד תעזור לשפר את איכות הקוד שלכם - קחו קטע קוד, תפרקו אותו, ועל כל שורה נסו לשאול כמה שיותר שאלות "ומה אם?". אז הנה דוגמא קצרה על פונקציית פייתון שמחשבת ערך בסדרת פיבונאצ'י:
def fib(n):
if n == 0 or n == 1: return 1
return fib(n-1) + fib(n-2)
ועכשיו נשאל -
1. ומה אם n הוא שלילי?
2. ומה אם n הוא בכלל לא מספר?
3. ומה אם n הוא מספר גדול מאוד?
4. ומה אם אני צריך לחשב סכום של 10 מספרי פיבונאצ'י?
5. ומה אם אני צריך לשפר ביצועים ולהעביר חלק מהחישובים לתהליכון נפרד?
6. ומה אם הקוד שלי צריך לרוץ על מכונה שאין בה הרבה זיכרון?
כל שאלת "ומה אם" פותחת דלת לדיונים מעניינים על מימושים חלופיים או תוספות לקוד שיעזרו להתמודד עם המקרה. האם במצב שמעבירים לי ערך שלא ציפיתי לו כדאי לי לזרוק Exception או לנסות להתמודד? האם שווה להתאמץ כדי לזכור ערכים שכבר חישבתי כדי שבפעם הבאה שיבקשו אותם החישוב ילך יותר מהר? איך כדאי להתמודד עם מגבלות זיכרון שאולי יש למכונה?
לא חייבים לפתור את כל שאלות "ומה אם". המטרה היא לשחק עם הקוד, לזהות מקרים שלא טיפלנו בהם ולחשוב איך היינו פותרים אותם אם הצורך היה עולה. ככל שמתאמנים יותר על המצאת השאלות האלה, כך לאט לאט זה בא יותר בקלות ועוזר לכם לכתוב קוד שיודע להתמודד טוב יותר עם שינויים.1 420
# למה הכל מסובך כאן?
באוגוסט 2006 פייסבוק יצאו עם ה API הראשון שלהם והם רצו להכניס כמה שיותר מתכנתים שיכתבו כמה שיותר אפליקציות עבורם. כל הדיון על פרטיות היה רחוק בעתיד. בעזרת ה API ומשחקים חברתיים כמו פארמוויל פייסבוק נתנה את מכת המחץ למייספייס והפכה לרשת החברתית של העולם.
בשלוש עשרה השנים שעברו מאז הכל השתנה: היום אפילו בשביל ליצור אפליקציה שרק תכתוב לעצמי על הקיר אני צריך לכתוב מדיניות פרטיות לאפליקציה ולהעביר אותה דרך הבודקים של פייסבוק לפני שגולשים אמיתיים יחשפו לתוכן שהאפליקציה יוצרת. גם מערכת ההרשאות עברה שינויים רבים והיום ההרשאות מגיעות לרזולוציה מאוד גבוהה כדי שאפליקציות יוכלו לעשות רק מה שמשתמשים מעוניינים שהאפליקציות יעשו ואנחנו המשתמשים יכולים לשלוט בדיוק במה מותר לכל אפליקציה לראות.
מנקודת מבט של מתכנתים ב-13 שנים שה API של פייסבוק נמצא באוויר הוא שינה צד: היום יצירת אפליקציה היא תהליך מסובך. אנחנו צריכים יותר השקעה בשביל לקבל אפליקציה שיכולה לעשות פחות עם הפלטפורמה. אבל לסיבוך הזה יש גם צדדים חיוביים, ומתכנתים שמכירים טוב את מערכת ההרשאות של פייסבוק ויודעים לכתוב מהר אפליקציות שעושות שימוש מדויק ומהיר במערכות המסובכות יותר יכולים לגבות על העבודה שלהם יותר ממה שהיו יכולים לפני עשר שנים.
במקום לשאול "למה זה כזה מסובך?" שווה לעצור רגע, לקחת אוויר ודווקא לשמוח - כי כשמעלים את הרף אנחנו מקבלים הזדמנות לעשות עבודה טובה יותר.
1 420
# אצלי אין באגים
אם נרשמתם לוובינר שהתקיים היום קיבלתם שעה לפני הוובינר מייל תזכורת שנשלח כמעט לגמרי מעצמו שמזכיר לכם שעוד שעה מתחילים וכולל לינק לכניסה. את מנגנון האוטומציה כתבתי בתחילת השבוע וגם אני נפלתי בבור שאומר שאם הקוד קצר לא צריך לבדוק אותו (או פשוט "אצלי אין באגים").
זאת הפונקציה שהיתה אמורה לשלוח את התזכורת לוובינר לגמרי לבד:
def perform(workshop_instance)
return if (workshop_instance.date - Time.zone.now) > 1.hour
return if workshop_instance.passed?
zoom = Zoom.new
emails = zoom.meeting_registrants(workshop_instance.zoom_id)
NotificationsMailer.webinar_reminder(workshop_instance, emails).deliver_now
end
חשבתי - יש פה 5 שורות... מה כבר יכול להשתבש?
אז לא ניכנס עכשיו למה יכול להשתבש ומה תכל'ס השבש. במקום זה עדיף לדבר על הבדיקה שכתבתי רק אחרי שהקוד נשבר. היא נראית כך:
require "rails_helper"
RSpec.describe WebinarReminderJob, :type => :job do
let (:wi) { workshop_instances(:one) }
before(:each) do
wi.create_zoom_meetup
end
after(:each) do
wi.delete_zoom_meetup
end
describe "#perform" do
it "sends an email to workshop participants" do
zoom = Zoom.new
zoom.add_user(wi.zoom_id, email: 'testuser@gmail.com', first_name: 'test', last_name: 'user')
WebinarReminderJob.perform_now(wi)
expect(ActionMailer::Base.deliveries.last.to).to eq(['testuser@gmail.com'])
end
end
end
הבדיקה יוצרת וובינר, רושמת אליו משתמש ואז מנסה לשלוח מייל לכל המשתתפים. היא מצפה שלפחות מייל אחד יישלח לכתובת אותה הגדרתי, ובסוף מוחקת את הוובינר מזום.
כמה נקודות לגבי הבדיקה ששווה לשים לב אליהן, גם אם לא מכירים רובי:
1. אין Mock ל Zoom - העבודה מול ה API החיצוני של זום ובאמת נוצרת שם פגישה בשביל הבדיקה שנמחקת בסופה. זה חשוב כדי לוודא שכל התקשורת מול זום עובדת (כלומר שאנחנו מביאים כמו שצריך את רשימת המשתתפים בפגישה).
2. יש Mock למנגנון המייל - המייל לא באמת נשלח למשתמש הבדיקה. באופן אוטומטי בגלל שרצים בטסט ריילס שומר את המייל שהיה אמור לשלוח בתוך אוביקט בשם ActionMailer::Base.deliveries. המוק הזה נוצר אוטומטית כחלק מהפריימוורק לכן אני שמח להשתמש בו.
3. אני לא בודק כאן שהמייל נשלח כמו שצריך או נראה טוב. אלה בדיקות אחרות שצריך לכתוב אותן ביום אחר (וממילא הן בודקות מנגנונים אחרים ולא את ה-5 שורות שראינו למעלה).
ובכל זאת אם הייתי כותב את הבדיקה הזאת בזמן היא היתה נכשלת וחוסכת לי להילחץ בבוקר ולהעלות תיקון בתשע כדי להספיק לשלוח את מייל התזכורת בזמן. ועכשיו שכתבתי אותה היא תישאר איתי לכל שינוי עתידי במנגנון. מה למדנו? שגם ב-5 שורות הכי קלות בעולם יכולים להסתתר באגים, ושאין דבר כזה קוד קל מדי. כשבודקים את הדבר הנכון, עשר דקות השקעה בכתיבת הבדיקה מחזירות את עצמן כל פעם מחדש.1 420
# פשוט כי בא לי להחליף
סיבוב קצר ב Stack Share ילמד אתכם שאיביי עדיין משתמשים ב Java, וכמוהם גם אובר, סלאק, לינקדאין, אברנוט ועוד אלפי חברות אחרות. ג'אווה יכולה לעשות כל מה שאתם צריכים במוצר שלכם ועוד. גם ריילס. גם נוד.
כמעט בכל המקרים ההתלבטות בין טכנולוגיות לא קשורה לדברים שאפשר או אי אפשר לעשות עם הטכנולוגיה, אלא למסר שאתם רוצים לשדר לעובדים שלכם ולעצמכם. הבחירה להחליף מ React ל Vue או מ Node.JS ל Elixir (או ההיפך) לא באה בגלל שלא הצלחתם לבנות משהו ב React, או ש Node לא נתן ביצועים מספיק טובים.
כן סיכוי טוב שיש לכם קוד ספגטי במערכת שנכתב כי מישהו כתב את המוצר תוך כדי שהוא לומד את הטכנולוגיה. כן אני מבין לגמרי את הרצון להיפטר מהקוד הזה ולהחליף אותו במשהו חדש ונוצץ. אבל אין סיבה להאשים את הטכנולוגיה. יש אחלה מערכות שכתובות בדיוק בטכנולוגיה שאתם רוצים לעזוב.
לפעמים נדמה לי שיהיה יותר מועיל לכולם אם נוכל להגיד ״אני רוצה לזרוק את קוד ה PHP הזה ולהחליף אותו ב JavaScript, פשוט כי כל הילדים המגניבים כותבים היום JavaScript״, בלי שאף אחד ירים גבה.
1 420
# זה לא בשבילך
מספיק לצאת לטיול קצר בכיכר המדינה בשביל לשים לב שיש חנויות שהן לא בשבילך, ואפילו לא צריך להסתכל על המחיר. משהו בעיצוב, בלוקיישן, באווירה כבר מעביר את המסר. לפרילאנסרים ובמיוחד כאלה שעובדים ברשת הרבה יותר קשה להעביר את המסר.
בגדול מה שהיינו רוצים להגיד זה ״אנחנו מחפשים לקוחות מעולים שידחפו אותנו ללמוד, להתאמץ ולהשתפר. תשאירו הודעה רק אם אתם כאלה״. אבל בינינו אף אחד לא באמת קורא את הטקסט מעל טופס השארת הודעה. פרילאנסרים שרוצים למתג את עצמם כיוקרתיים יותר יצטרכו לגרום ללקוחות שלהם להתאמץ. רעיונות? הנה כמה שפגשתי ברשת:
1. לבטל את טופס צור קשר. מי שבאמת רוצה ימצא דרך להגיע.
2. לשלוח הצעת מחיר רק אחרי פגישת היכרות בתשלום. אם הלקוח יקבל את ההצעה עלות הפגישה תתקזז מעלות העבודה.
3. לדרוש מכל אחד שמגיע לספר מי שלח אותו, ולהסכים לעבוד רק עם אנשים שלקוח טוב וקיים שלכם הפנה.
4. לפרסם באתר את המחיר, ושיהיה כפול מכל מחיר אחר שאתם מוצאים ברשת.
ומה אם אף לקוח לא יבוא? כאן ההזדמנות שלכם להרים פרויקטים של עצמכם או בהתנדבות ולהראות שאתם מסוג הפרילאנסרים ששווה לעמוד בתור בשביל לעבוד איתם. הדרך למצוא עוד לקוחות היא להעלות את הרף, לא להוריד אותו.
1 420
# איך לתקן כל באג בעולם
מסתבר שלתקן באגים זה דבר ממש קל. התהליך מורכב בסך הכל מ-3 שלבים:
1. מתחילים בכתיבת טסט שנכשל בגלל הבאג.
2. מתקנים את הבאג.
3. רואים שהטסט עובר ועושים קומיט.
מעניין לגלות שרובנו מדלגים על השלב הראשון, ואז מתפלאים שהבאג חוזר לרדוף אותנו אחרי חצי שנה.
