דלג לתוכן הראשי

בלוג

כתיבה טכנית על Kotlin, backend development וארכיטקטורת תוכנה. הפוסטים בתהליך העברה – בינתיים ראו kotlinbackend.com.

XKCD: מטאיל לתמונה - לראות את התמונה המלאה

מבוא

אם יש דבר אחד שאני יכול לומר על עצמי, זה שאני אוהב אתגרים שקשורים לתכנות. הם לא חייבים להיות משמעותיים או אפילו שימושיים, אבל אני נהנה מהאתגר. לכן כשראיתי את ההודעה הזו ב-LinkedIn שלי, הייתי חייב לקחת על עצמי את האתגר!

אם אתם לא מכירים את XKCD, הנה מה שויקיפדיה אומרת עליו:

xkcd, sometimes styled XKCD, is a webcomic created in 2005 by American author Randall Munroe. The comic’s tagline describes it as “a webcomic of romance, sarcasm, math, and language”. Munroe states on the comic’s website that the name of the comic is not an initialism but “just a word with no phonetic pronunciation”.

איך לתקן קונפיגורציות שגויות ב-RedisTemplate

מבוא

הסיפור שלנו מתחיל עם עמית ואני שמנסים לדבג בעיה בפרויקט שלנו כמה שעות. היינו צריכים לשלוף ערך מ-Redis, אבל בכל פעם שהשירות רץ, הערך שחזר היה null. למרות המאמצים שלנו, לא מצאנו פתרון באינטרנט, ולמרות הכל — הקוד שלנו היה מכוסה בטסטים שכולם עברו!

במאמר הזה נחקור בעיה נפוצה כשמשתמשים ב-RedisTemplate באפליקציות Spring. נדגים איך קונפיגורציות שגויות יכולות לגרום לכך שהטסטים עוברים אבל שליפת הנתונים הנכונים נכשלת. בנוסף, נראה איך לקנפג RedisTemplate בצורה נכונה כדי להימנע מהבעיה.

Observability בפעולה: איך להשתמש ב-OpenTelemetry

מבוא

במאמר הזה נצלול לתוך השלבים של הוספת observability לקוד שלכם באמצעות OpenTelemetry. קודם, נפתח ספרייה שמושכת נתונים מ-remote API. אחרי זה, נבנה שירות שמשתמש בספרייה הזו לשליפה ושמירה של הנתונים במסד נתונים.

תוך כדי, נשלב OpenTelemetry ב-Kotlin backend service שלנו, ונדגים את ההתנהגות בסביבה שדומה לפרודקשן. אחרי שהשירות יהיה מצויד ב-instrumentation, נוסיף לו filter שדוחה בקשות גדולות מדי. גם ה-filter הזה יהיה עם instrumentation.

כל דוגמאות הקוד לסדרה הזו זמינות ב-GitHub:

[שאלות ראיון] Concurrency לעומת Parallelism: פענוח האשליה של הבו-זמניות

TL;DR - מה ההבדלים בין תכנות concurrent לתכנות parallel?

אחד הפוסטים המוצלחים שלי עד כה הוא הסבר מפורט על שאלת הראיון האהובה עלי (ראו How does HashMap work in Java? לפרטים נוספים). לכן החלטתי ליצור סדרה של פוסטים שמפרקים שאלות נוספות. כל השאלות שיוענו בסדרה הזו שימשו בתהליך הגיוס של המעסיק הנוכחי שלי.

בפוסט של היום נתמקד ב-concurrent ו-parallel programming. אז בלי יותר דברי פתיחה, בואו נתחיל!

ההבדל בין Concurrency ל-Parallelism

למרות ש-concurrency ו-parallelism קשורים זה לזה, הם בהחלט לא אותו דבר. יש הרבה הגדרות ל-concurrency ול-parallelism. ההגדרה האישית האהובה עלי היא:

פתרון בעיות מהחיים: לקחים מעקרונות ההנדסה שלי

המעסיק שלי הודיע לפני כמה חודשים שכל עובד שעובד שלוש שנים ומעלה זכאי ל-sabbatical — חופשה בתשלום מלא למשך חודש לפי בחירתו. מאחר שאשתי ואני צברנו מספר ניכר של ימי חופשה, החלטנו לצאת למסע של חודשיים לאסיה — יעד שתמיד רצינו לבקר בו. בפוסט הזה אתאר צעד אחר צעד איך יישמתי שיטות מעבודת היומיום שלי כמהנדס תוכנה לפתרון בעיות מהחיים.

עיקרון 1: בסוף משהו תמיד יישבר בפרודקשן

Eventually, something will break

איך לבנות Domain Gateway עם OpenApi

TL;DR: המאמר הזה מסביר מה זה domain gateway, איך לבנות אחד ולמה תרצו אותו.

מה זה Domain Gateway?

domain gateway הוא מקרה פרטי של ה-API gateway pattern. האתר java-design-patterns מגדיר את ה-gateway pattern כך:

With the Microservices pattern, a client may need data from multiple different microservices. If the client called each microservice directly, that could contribute to longer load times, since the client would have to make a network request for each microservice called. Moreover, having the client call each microservice directly ties the client to that microservice – if the internal implementations of the microservices change (for example, if two microservices are combined sometime in the future) or if the location (host and port) of a microservice changes, then every client that makes use of those microservices must be updated. The intent of the API Gateway pattern is to alleviate some of these issues. In the API Gateway pattern, an additional entity (the API Gateway) is placed between the client and the microservices. The job of the API Gateway is to aggregate the calls to the microservices. Rather than the client calling each microservice individually, the client calls the API Gateway a single time. The API Gateway then calls each of the microservices that the client needs.

איך להשתמש ב-OpenApi לבניית RESTful API חזק

הערת עורך: הפוסט הזה נכתב על ידי במקור ופורסם בבלוג של SumUp. אבל הרבה השתנה מאז. אני כבר לא עובד ב-SumUp, OpenAPI שחרר שתי גרסאות major, ל-Spring Boot היה release major, ואפילו ל-Gradle היו כמה releases major. לא רק זאת, כישורי הכתיבה שלי השתפרו דרמטית מאז, ולאורך זמן מצאתי כמה טעויות קטנות במאמר המקורי. מאחר שהמאמר המקורי הוא אחד המוצלחים שלי, החלטתי לכתוב אותו מחדש ולפרסם גרסה מעודכנת.

מבוא

RESTful API — הצד המכוער

כמהנדסת/מהנדס backend, פיתחתי APIs רבים ב-REST במהלך הקריירה שלי. אחת הבעיות הכי מעצבנות שנתקלתי בה שוב ושוב הייתה חוסר בשילוב חלק בין ה-backend לבין הלקוחות. שגיאות כתיב ב-URLs, חוסר עקביות ב-JSON (camel case לעומת snake case), העברת ערכים מהסוג הלא נכון (לדוגמה, string במקום integer) ועוד טעויות דומות קרו לי הרבה פעמים.

איך HashMap עובד ב-Java?

בתור מראיין, אני הרבה פעמים שואל על איך HashMap עובד ב-Java. זה עוזר לי להעריך את ההבנה של המועמד במבני נתונים, ב-JVM internals ובגישה שלהם לפתרון בעיות. נתקלתי בהרבה מועמדים — ג’וניורים, מידים וסניורים — שלא הצליחו לענות על השאלה הזו נכון. אז החלטתי לשתף את התשובה עם כולם.

במאמר הזה אני אסביר את שאלת ה-HashMap צעד אחר צעד.

מה החוזה בין הפונקציות equals() ו-hashCode() ב-Java?

ב-Java, כל האובייקטים יורשים את הפונקציות equals() ו-hashCode() מקלאס Object. לפי הדוקומנטציה של equals(), יש צורך לעקוף גם את המתודה hashCode(). זה מבטיח שאובייקטים שווים יהיו בעלי hash codes שווים.

איך לשבור HashMap בפחות מדקה

TL;DR: אף פעם אל תשתמשו באובייקטים mutable כמפתחות ב-HashMap!

אחרי שכתבתי את המאמר How does HashMap work in Java?, כמה אנשים הציעו נושאים נוספים הקשורים ל-HashMap. בגלל זה החלטתי ליצור סדרה קצרה של מאמרים על הנושא.

במאמר של היום נדבר על JVM HashMaps ועל איך קל לשבור אותם אם לא משתמשים בהם בזהירות. חשוב לציין שלמרות שנתמקד בעולם ה-JVM, אותם עקרונות חלים על רוב שפות התכנות המודרניות.

במאמר הזה אני אספק מימוש ב-Java ואסביר את שורש הבעיה. אני גם אציע פתרונות לבעיות שאני מציג.

יצירת Spring Boot App Banner מותאם אישית

היום אני רוצה לשתף אתכם בפיצ’ר כיפי של Spring. הוא לא חדש או קריטי, אבל הוא בהחלט מהנה!

בדרך כלל, כשמפעילים את אפליקציית Spring Boot, רואים banner סטנדרטי ב-logs כזה:

Spring Boot Banner

אבל האם אי פעם חשבתם להחליף את ה-Spring banner ב-banner מותאם אישית? אם כן, המאמר הזה בשבילכם!

כדי להתחיל, בואו נגש ל-https://patorjk.com/ — אתר שעוזר לנו ליצור טקסט מותאם אישית. אפשר להכניס את הטקסט הרצוי ל-log ולבחור מתוך מגוון גופנים. לדוגמה: