אתמול בעבודה* הצגתי את הדמו שעבדתי עליו במשך היום לאחראי עליי, הראתי לו איך הדברים עובדים ומתברר שמשהו שעשיתי שעובד נכון, עשיתי בדרך הלא יעילה, קורה, טועים.
מה שעשיתי זה לעבור על כל הרשומות בטבלה מסויימת ואז דרכה לגשת לטבלאות אחרות שנמצאות בקשר גומלין איתה, בקוד מופשט:
Publisher.find(:all).each do |publisher|
articles = publisher.articles.find(:all, :condition=>”…” ).each {|a| do_something(a) }
# …
products = publisher.products.find(:all, :condition=>”…” ).each {|p| do_something_else(p) }
# …
end
האחראי עליי כשראה את הקוד, התחיל לדאוג לגבי איך שהסקריפט ירוץ בפרודקטשיין, טבלת Publisher אמורה להכיל כמה אלפי רשומות, מה שאומר שהסקריפט בעצם היה מריץ פי שניים שאילתות (נגיד 5000*2 = 10000 שאילתות) מה שהיה גורם למערכת עצמה לקרוס תחת העומס העצום על המסד הנתונים.
הדרך הנכונה לעשות את הנ”ל היה פשוט לעשות כך:
articles = Article.find(:all, :conditions=>”…” )
products = Product.find(:all, :conditions=>”…” )
בשני המקרים יוחזרו אותם תוצאות, רק ההבדל שהפעם כל התוצאות מוחזרות לתוך container אחד ואני צריך לבצע עליהם את הסינון לפי ה-publisher_id והם לא נשלפים לפיו.
רק שכאן, מבחינת יעילות אני מבצע רק שתי שאילתות וחוסך round trips למסד.
ברור לי שאם הייתי עובד על הדמו הזה בטכנולוגיה אחרת, שבה אני חייב לכתוב את ה-SQL בעצמי, כמו PHP למשל, הייתי ישר עושה את הדרך השנייה, כי הראשונה היא יותר ארוכה וצריך להרכיב בה יותר שאילתות - הייתי חושב מראש על שאילתא אחת שהייתה עושה בדיוק מה שאני צריך. מה שהוביל אותי למסקנה שככל שהטכנולוגיה יותר מפשטת ככה צריך לשים לב יותר למה שעושים, נורא קל לעשות טעויות כמו שעשיתי בטכנולוגיה שקל לכתוב בה קוד ומהר כמו ב-rails.
——-
* שבוע שעבר התחלתי לעבוד בחברת הסטארטאפ Kontera ובינתיים נהנה מהעבודה, מהאנשים ומהתנאים המצוינים שקיימים שם.