רשומות

קודם כל פייפליין

תמונה
מבוא לרגל הגעתו של הבלוג ל150,000 כניסות החלטתי לחזור לפוסט קצר ואולי קצת פילוסופי (שאולי יחזיר לי את המוטיבציה לחזור לכתוב) על החשיבות הכנסה של continuous integration (CI) בסיסי לקוד שלנו עוד לפני שבכלל יש לנו קוד שעובד. אני לא אתעקב הרבה על מה זה CI כי יש על זה טונות של מידע באינטרנט , הצחיק אותי לגלות שבעברית קראו לזה ״אינטרגציה רציפה״. אני רק אגיד במשפט, שכשאני אומר CI אני מתכוון לתהליך שמושך את הקוד, ומבצע עליו פעולות כדי לוודא שהוא לא שבור לחלוטין . לדוגמה - מריץ עליו כלים של static analysis, מקמפל אותו, מריץ עליו unit tests, מעלה אותו לסביבת בדיקות, בונה ממנו package, מריץ עליו integration tests ועוד מיליון דברים שאפשר לעשות - וכל זה על שרת מרוחק. בפוסט לא אדבר על איך נכון לבצע CI אלא רק על החשיבות של הכנסה שלו כמה שיותר מוקדם. למה CI כל כך חשוב בעיני סיבה 1 - fail fast כשאני מפתח תוכנה (וזה לא חשוב מה היא עושה) אני דואג שיהיה לי איזה שהוא סוג של ולידציה על הקוד שלי (כמו שתיארתי במבוא), לרוב אני דואג לבצע דחיפות תדירות ל source control ותוך כדי שאני מפתח, במסך השני שלי פתוח הדשב

הקמת שרת PyPI ב-5 דקות

תמונה
לאחרונה יצא לי לדבר בבלוג לא מעט על הצד היותר ״devopsי״ של פיתוח תוכנה. דיברנו קצת על  סביבות וירטואליות , על  pip , על  יצירת חבילות , ואפילו על  git submodules . הפוסט הזה ממשיך את הפוסטים הקודמים לו ומדבר עלי איך אנחנו יוצרים שרת אליו ניתן להעלות חבילות פייתון, וכן, לצרוך אותן. בחברות רבות, גם בזו בה אני עובד כיום, ישנו איסור על העלאה של קוד לציבור הרחב על מנת שלא לחשוף את סודות החברה. אבל מה אם בכל זאת אנחנו רוצים לשתף חבילות pip בין צוותים בתוך הארגון? בפוסט הזה אראה את הדרך הפשוטה ביותר שמצאתי להקים שרת PyPI בסיסי, להעלות אליו חבילות לחלוק אותן עם שאר הארגון. דרישות - מחשב עם docker עליו (נכון, אפילו לא חייבים פייתון) ומכונת לינוקס שתאחסן את השרת. קובץ הסיסמאות תחילה ניצור את קובץ הסיסמאות על מנת שלא לשמור סיסמאות בטסקט על הדיסק, ניתן לעשות את זה באמצעות ה cli של htpasswd או פשוט באתר אינטרנט כלשהו שמייצר קבצי סיסמה מסוג htpasswd. בכדי לעשות זאת נתקין את הכלי שמייצר סיסמאות באופן הבא: sudo apt-get install apache2-utils # UBUNTU or sudo yum install httpd-tools # Red Hat וניצור א

מה ההבדל בין אוטומציה לפיתוח רגיל

תמונה
מבוא בתעשייה יש כיום שיח סוער מאוד על ההבדל בין אוטומציה לבין פיתוח. בעוד שיש אנשים שאומרים שאוטומציה זה פיתוח לכל דבר ומי שכותב אוטומציה צריך להסתכל על עצמו כעל מפתח, יש אנשים שרואים בפיתוח אוטומציה כתחום ששווה פחות, מתגמל פחות ודורש פחות הכשרה. הפוסט הזה אינו עוד שיחת מוטיבציה עם מסר של ״גם מפתחי אוטומציה הם מפתחים וצריך להתייחס אליהם ככה״. מטרת הפוסט היא להציג את נקודת מבטי האישית על תחום האוטומציה, על ההבדל בינו לבין תחום פיתוח התוכנה ה״רגיל״ לנסות לתת מענה לשאלה - מדוע אנשים רואים פער בין התחומים? קודם כל, מה זה פיתוח אוטומציה? יש הרבה הגדרות ל״מה זה אוטומציה״ ואני חושב שזו אחת הסיבות המרכזיות לדיון הבלתי נגמר על ההבדלים. כשאני מדבר על אוטומציה אני מדבר על כל קוד שנכתב כדי לעזור לנו לקדם את התהליכים שאחרת היו נעשים באופן ידני. כללי, נכון? זו בדיוק המטרה (בהמשך הפוסט נראה בדיוק למה ההגדרה כללית כל כך וכלל לא משנה). לפי ההגדרה הזו, כתיבת הספרייה selenium היא כתיבת אוטומציה, אם ניקח את זה קצת יותר רחוק, גם כתיבת המערכת jenkins היא אוטומציה. האם Jason Huggins ו Simon Stewart, שניים

יצירת חבילת pip ב-5 דקות

תמונה
מבוא כתבנו קוד, אנחנו מרוצים ממנו וחושבים שהוא יכול להועיל לעוד אנשים, אולי בתוך אותו ארגון בו אנחנו עובדים ואולי פשוט להוציא את החבילה לשימוש העולם. יש הרבה דרכים לחלוק קוד עם הקהילה, אבל אחת הנפוצות מבניהן היא יצירת חבילה שכל מה שהמשתמש יצטרך לעשות על מנת לצרוך אותה זה pip install . בפוסט הזה נדבר שלב אחרי שלב על איך יוצרים חבילת pip, מעלים אותה לשרת החבילות pypi.org  ומתקינים היכן שרק נרצה. חשוב לציין של-setuptools קיימים פיצ'רים רבים וחלקם גם מורכבים, שלא אגע ברובם. להרחבת הקריאה אני ממליץ כמו תמיד לגשת לדוקומנטציה הרשמית. למה לא סתם פרויקט בגיט שעושים לו clone? או אפילו git submodule? אם אני עובד בחברה, ובחברה הזו יש צוות שצריך ממני את הקוד שכתבתי, הוא יכול לצרוך אותו בעוד דרכים כמו clone או submodule . למה בעצם לא ללכת בדרך הזו? התשובה הפשוטה היא כי זה לא מסודר . pip מהווה עבורנו ניהול מסודר של חבילות וגם של תתי-התלויות שלהן. כשאנחנו עובדים מול גיט בתצורה של submodule או clone לפרויקט אנחנו צריכים לנהל בעצמנו את הגרסאות, ומכיוון שגיט עובד לפי commits, נצטרך להתקין את החבילה כ

איך להשיג פרודוקטיביות מקסימלית?

תמונה
מבוא בעולם התעסוקה כיום יש בעיה מהותית מאי פעם - הסחות דעת . היכולת לשבת ולבצע עבודה איכותית לאורך זמן כמעט ונעלמה מהשוק, ובטח שהיא כבר לא עיקרו. בתחום התוכנה ובחברות ההייטק מרגיש לי שזה לא פחות גרוע. מגיעים לעבודה (מאוחר יחסית), עובדים חצי שעה, מגיע חבר, שותים קפה, עובדים עוד כמה דק׳, פגישת דיילי סטנדאפ (כי חייבים להתעדכן), ממשיכים לעבוד, הסלאק פתוח, מישהו צריך עזרה עם משהו שאנחנו התעסקנו בו, אז מה, לא נעזור? עולים לזום, ארוחת צהריים, קפה של אחרי, happy hour ועוד מיליון פעילויות שהחברה מארגנת. והכי חשוב - שעה ביום של ויכוחים על Naming. לאחרונה קראתי את הספר Deep Work של Cal Newport (פרופסור למדעי המדעי המחשב מ MIT בעבר ומאוניברסיטת ג׳ורג׳טאון בהווה שהקדיש מרבית חייו למחקר על פרודקטיביות). והחלטתי לפנות לספר על מנת לענות לנו על השאלה, איך יוצאים מהמעגל הזה ומשיגים פרודוקטיביות אמיתית ויציבה? בספר יש מספר רב של נקודות מעניינות וטיפים למחשבה, מטרתי בפוסט היא לא לסכם את הספר, אלא להציג את הנקודות המעניינות בו ואיך הן עזרו לי. ניופורט (המחבר) מחלק את הספר לשני חלקים, בראשון הוא מציג את המו

פוסט אורח: Data Objects בפייתון - מ tuple ועד dataclass

תמונה
פוסט אורח מאת ליאור אלבז ליאור הוא מפתח תוכנה צעיר ומוכשר מאוד, עובד כעת בחברת דיפ אינסטינקט . ליאור משקיע את מרבית שעות היום שלו בפיתוח ובלמידה של טכנולוגיות חדשות. לא צריך לדבר איתו יותר מ5 דק׳ כדי להבין שהוא חי את עולם התוכנה ועוד יעשה דברים גדולים. מבוא פעמים רבות כשאנחנו כותבים קוד נרצה להעביר מידע בין מחלקות, פונקציות או לשלוח מידע בבקשות דרך הרשת. בכל שפת תכנות עילית קיימים כיום סוגים שונים של מבני נתונים ואובייקטי מידע בהם נוכל להשתמש על מנת לארוז את אותו המידע ולהעביר אותו ממקום למקום. לדוגמה, במקום להעביר לפונקציה מסוימת מספר של פרמטרים באופן הזה: print_shape(color= 'red' , category= 'rectangle' , size= 10 )                                                                                                   אבחר להעביר לה אובייקט באופן הבא: print_shape(my_shape)                                                                                                                                                               ובתוך print_shape אוכל לבצע שימוש באובייקט הזה