זהירות הודעה ארוכה ... מאוד.

kity02

New member
תודה על הפירוט. נשמע מאוד מעניין

והלוואי שיעזור לכולם, כמו שעזר לך...
 

maximbu

New member
חלק חמישי

סוג שביעי של שאלות נכנס תחת הגדרה של "שאלות מוזרות" לדוגמא "איך היית מעצב / מתכנן חדר אמבטיה ?" או "כמה תחנות דלק יש בגוש דן?". אז מה עושים עם שאלות כאלה ? קודם כל נושמים עמוק ומנסים לפענח מה לעזאזל רוצים מכם . אז ככה זה לא שהמראיין בדיוק עושה שיפוץ בבית וזקוק נואשות לחוות דעת , הוא גם לא מחלטר בשום חברת סקרים מעניין אותו בעיקר 2 דברים לגבי שאלות "עצב / תכנן" האם אתם מבינים את כל הtrade-offs של התכנון (ממש בגדול) והאם אתם חושבים לפני שאתם פועלים , בשאלות של "הערכה" הוא בודק האם אתם מסוגלים להתמודד עם בעיות שלכאורה אין לכם שום מושג בהן. ולא פחות חשוב האם אתם נלחצים כשאתם לא יודעים משהו או לא. אז איך עונים על שאלות כאלו ? לגבי תכן / עצב ... פשוט שואלים שאלות (מה הגודל של החדר , עבור מי זה , בכמה כסף מדובר , האם יש העדפה לאמבט או דוש , וכו'...) נשמע לא קשור בכלל , כן אתם צודקים ובכל זאת אם תתבקשו ליצור GUI גם פה לא יהיו חסרים שאלות שתצטרכו לשאול (עבור מי , פשטות מול פונקציונליות , זמן תגובה מול גרפיקה , האם יש דרישה לבטיחות מוגברת וכו'). איך עונים על שאלות כמו כמה תחנות דלק יש בגוש דן ? זורקים מספרים באוויר (לאף אחד לא אכפת מהם) ומנסים להגיע לסדר גודל של תשובה נגיד משהו כמו : בישראל יש משהו כמו 7 מיליון תושבים מתוכם משהו כמו מליון גרים בגוש דן , משפחה ממוצעת היא של 4 נפשות ולמשפחה ממוצעת יש בערך אוטו וחצי סה"כ קיבלנו שבגוש דן יש משהו כמו 400 אלף מכוניות . כל מכונית ממלא דלק משהו כמו פעם בשבוע , לכן תוך שבוע כל תחנות הדלק מטפלות במשהו כמו 400 אלף מכוניות. לוקח משהו כמו 6 דקות למלא דלק ובו זמנית בממוצע 3 מכוניות ממלאות דלק באותה תחנה בכל זמן נתון כלומר בשעה משהו כמו 30 מכוניות עוברות בתחנת דלק אחת ביום זה משהו כמו 200 ובשבוע 1400. כלומר יש משהו כמו 400/1.4 בערך 300 תחנות דלק בגוש דן. ברור שהמספרים שלקחתי פה ממש לא קשורים למציאות אבל בשורה התחתונה תקבלו הערכה גסה לשאלה ששאלו אתכם וזה הרבה יותר טוב מאשר לעמוד ולבהות במראיין. מקווה שהבנתם את הכיוון הכללי. דוגמאות לסוג הזה (ושוב עם הסברים הרבה יותר טובים משלי) ניתן למצוא בספר How Would You Move Mount Fuji (כן אותו אחד ממקודם) ושוב מומלץ. סיכום ראיונות מקצועיים : לא משנה מה שואלים אתכם אל תשמרו את המחשבות שלכם לעצמכם. לא הבנתם את השאלה תבקשו הבהרה או תנסו לצייר לעצמכם דוגמא (המראיין כבר יתקן אתכם אם אתם לא בכיוון). מאוד חשוב להפגין בטחון עצמי (לקח לי זמן להבין את זה) ואמונה בעצמך (אם אתה לא בטוח שאתה מתאים למה שהמראיין יחשוב אחרת?). לזכור שגם מראיינים טועים לפעמים ולא להילחץ אם אתם שומעים תשובה שלדעתכם לא נכונה. בכלל לא להילחץ ... מכלום (קשה ליישם כל עוד אתם רואים בראיון כמשהו שקובע את עתידכם , הרבה יותר קל ליישם את תתייחסו לזה כל "עוד מפגש עם בן אדם ששואל חידות"). בהתחלה כשהגעתי לראיונות באתי בגישה של "הלוואי אני אדע לענות על מה שישאלו" , לאחרונה (אחרי באמת הרבה חרישה , באמת) הגישה שלי שונתה ל"אני לא חושב שיש שאלה שאני לא מכיר / לא אצליח לפתור אחרי כל מה שאני כבר יודע" , נשמע שחצני , אולי , אבל זאת הרגשה ממש טובה ואני ממליץ לכם בחום לפתור את כל השאלות בספרים שהמלצתי עליהם ולעבור על הלינקים המצורפים בפוסטים הקודמים והזה , כן זה הרבה עבודה ודורש הרבה זמן אבל ההרגשה של ללכת לראיון ולהרגיש ממש בטוח בעצמך שווה את זה. הנה עוד לינקים מומלצים בנושא הזה : http://www.cprogramming.com/helpfree.html - תכתבו את כל פונקציות שמבקשים שם (כולה 10 פונקציות / תוכניות) ובכלל לדעתי זה אתר מעולה בשביל מתראיינים לC ו++C . http://rainbowonnet.blogspot.com/2006/12/cc-interview-questions-part-1.html שאלות "ידע" , כדאי מאוד לעבור על זה לפני הראיון http://www.joelonsoftware.com/articles/GuerrillaInterviewing3.html - הראיון המקצועי מנקודת מבטו של המראיין , שתדעו מה בודקים ומה מחפשים (לפחות בחברה ספציפית אחת) http://forum.bgu.co.il/index.php?showtopic=55149 פורום עם חידות http://www.jobhunt.co.il/?pageid=qdatabase#general דוגמאות לשאלות מראיונות עבודה ספציפיים (אפשר גם לשלוח שם קורות חיים לבחור נחמד מאוד שמבטיח המון דברים טובים תמורת תשלום רציני ביותר כשתמצאו עבודה – אני אישית ממליץ בינתיים לאמץ קודם את ההמלצות שלי בחינם ורק אם זה לא מצליח לשקול להיפרד מ500$) וכמובן לפתור (להבדיל מלקרוא) את הספרים עליהם המלצתי קודם. סיימנו עם השלב המקצועי. בפוסט הבא שלב משאבי אנוש וכרגיל תגובות יתקבלו בברכה.
 

MayaShuShu

New member
../images/Emo45.gif כל הכבוד ועוד משהו

שאלו אותי הרבה על ה-Garbage collection וגם איך עובד זיכרון של תוכנית - מה נשמר על ה- Stack / heap/ ושוב כל הכבוד על כל הפירוט!!
 

ג81

New member
אני אנסה לענות פה על שאלות הידע

ודרך אגב, כל הכבוד על ההשקעה, נראה לי שסיכויי למצוא עבודה עלו משמעותית אחרי שקראתי את מה שכתבת. אז אני אנסה לענות על שאלות הידע כדי לבדוק אם אני סגור עליהם (אז תקנו אותי אם אני טועה או אם התשובה שלי חסרה) ואולי זה יעזור גם לאנשים אחרים. אז נתחיל מפונקציה וירטואלית: פונקציה וירטואלית היא פונקציה, שגם אם היא ממושת במחלקת הבסיס(A), המחלקה הנגזרת(B) יכולה לממש אותה מחדש ואז אם נקרא לה מתוך אובייקט מסוג B, הפונקציה שתורץ תהיה זו של B ולא זו של A. כמובן שאם B לא מממשת את הפונקציה, הפונקציה שתורץ תהיה זו של A ואם יש עוד מחלקה C שיורשת מ-B ומממשת את הפונקציה ונקרא לפונקציה מתוך אובייקט מסוג C אז הפונקציה שתורץ תהיה זו של C. הפונקציה שתורץ תיבחר בזמן ריצה ולא בזמן קומפילציה, כי בזמן קומפילציה לא תמיד יודעים איזה אובייקט נבחר, למשל בדוגמא הבאה כאשר f היא הפונקציה הוירטואלית: A *a; ddd if (input > 0) ddd a = new B; ddd else ddd a = new A; ddd a->f(); ddd הפונקציה שתרוץ תלויה ב-input שיהיה ידוע רק אחרי שהמשתמש יכניס אותו, בזמן ריצה. כדי לממש את המנגנון הזה של בחירת פונקציה בזמן ריצה, לכל מחלקה שיש בה לפחות פונקציה וירטואלית אחת יש מה שנקרא "טבלה וירטואלית", כלומר טבלה שבה עבור כל שם של פונקציה וירטואלית (במקום שם יש בטבלה מספר שמזהה את הפונקציה) מתאים המימוש הנבחר של הפונקציה, למשל עבור המחלקה B, תהיה בטבלה שורה אחת: ptr, 0 כאשר 0 המספר שמזהה את f ו-ptr הוא מצביע ל-B::f()ddd. בכל אובייקט מסוג של מחלקה שיש בה פונקציות וירטואליות, יש "Virtual Pointer", כלומר מצביע לטבלה הוירטואלית של המחלקה (שהיא עצמה מוגדרת פר מחלקה ולא פר אובייקט). המצביע הזה נמצא ב-4 הבתים הראשונים של האובייקט. אז עבור התכנית שכתבתי, אם המשמתש מכניס קלט גדול מ-0 אז a מצביע מעכשיו לאובייקט מסוג B ולכן כאשר תורץ השורה האחרונה (a->f()ddd), התכנית תבדוק לאיזה סוג של אובייקט a מצביע, תראה שזה אובייקט מסוג B, תבדוק מה נמצא בטבלה שעליה מצביע ה-Virtual Pointer של B, תראה שהמצביע לתחילת המימוש של הפונקציה המתאימה הוא ptr ולכן תריץ את B::f()ddd.
 

ג81

New member
טוב אני רואה שאתם לא מגיבים אבל אני

אמשיך בכל זאת, זה עוזר לי להבין יותר טוב ואולי יעזור לעוד מישהו. מהו פולימורפיזם וכיצד הוא ממומש? פולימורפיזם הוא מושג המבטא רב צורתיות של משהו, למשל פועל בשפה העברית יכול להיות פועל בבניין פעל, פועל בבניין פיעל, פועל בבניין התפעל וכו'. נניח שאנחנו לוקחים שורש ידוע של פועל ידוע ורוצים לקבל את צורת העבר יחיד מדבר שלו. אז בבניין התפעל נקבל מילה מהצורה "התפעלתי" ובבניין פעל מילה מהצורה "פעלתי". עם זאת, על השאלה "מה עשית" אני אענה בעבר יחיד מדבר, לא משנה אם הפועל המתאים הוא בבניין פעל או בניין התפעל או בבניין אחר כלשהו. כלומר יש כאן אותה פונקציונליות בשינוי צורה. אם נעבור לעולם שפות התכנות אז פולימורפיזם הוא בדרך-כלל פונקציה שממומשת בצורות שונות במקרים שונים (או עבור אובייקטים שונים), אבל כל המימושים עונים לדרישה כללית כלשהי. ב-C++ אפשר לממש פולימורפיזם בעזרת פונקציות וירטואליות (שעליהן פירטתי בהודעה הקודמת שלי) או בעזרת templates.
 

yoniBLA

New member
הממ,

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

ג81

New member
למה אי-אפשר לממש פולימורפיזם בעזרת

templates? למשל ב-dot.net2, רשימה יכולה להיות List<int>ddd ויכולה להיות List<char>ddd (שם זה נקרא generics במקום templates). זה לא סוג של פולימורפיזם? בעצם זאת אותה פונקציונליות רק עבור מקרים שונים, כמו שמוגדר פולימורפיזם, לא? והדוגמא עם הפעלים זה כי עסקתי קצת ב-NLP אז בשבילי זה מהעולם האמיתי.
 

ג81

New member
המשך התשובות

להלן: A = מחלקת הבסיס, B = המחלקה הנגזרת הורס וירטואלי נדרש כאשר מצביע מטיפוס A עלול להצביע לאובייקט מטיפוס B ובמחלקה B יש צורך בהורס (יש באובייקט מטיפוס B משאבים שצריך לשחרר). אם לא נגדיר את ההורס של A כוירטואלי, אז לא תהיה טבלה וירטואלית ב-B ולכן לא יהיה שום מידע בזמן ריצה שיגיד איזה הורס להריץ. כלומר המידע היחיד שיהיה הוא העובדה שהמצביע הוא מסוג A ולכן ירוץ ההורס של A והמשאבים של B לא ישוחררו. כדי שהמשאבים ישוחררו, צריך להגדיר את ההורס של A כוירטואלי ואז למחלקה מטיפוס B תהיה טבלה וירטואלית ולאובייקט המדובר יהיה מצביע לטבלה זו וכך בזמן ריצה נדע לבחור את ההורס המתאים (ההורס של B). בקשר למה נבנה/נהרס קודם, זה מאוד הגיוני בסה"כ: כאשר נוצר אובייקט מסוג B, קודם נבנה A (נקרא הקונסטרקטור של A ובאובייקט השדות של A מאותחלים כפי שזה מוגדר בקונסטרקטור של A) ולאחר מכן נקרא הקונסטרקטור של B ואז כל השדות של B מאותחלים באובייקט כפי שזה מוגדר בקונסטרקטור של B. הנושאים האחרים שעליהם כתבת הם יותר קשים לי, אז עליהם אני אכתוב יותר מאוחר אחרי שאעשה קצת מחקר בנושא.
 

ג81

New member
בעצם שכחתי משהו,לפני שעברתי ל-GC

איך עובדת רקורסיה? רקורסיה עובדת בעזרת המחסנית של התהליך. כלומר אם יש לי פונקציה f(x)ddd ואני קורא מתוכה לעצמה, אז מתווסף למחסנית המשתנה x וכתובת החזרה (הכתובת של השורה הבאה אחרי הקריאה ל-f). כאשר חוזרים מהפונקציה f אז חוזרים לכתובת החזרה המצוינת על המחסנית. כמובן שאם אין תנאי עצירה (כלומר אם f תמיד ממשיכה לקרוא לעצמה) אז נוצרת רקורסיה אינסופית ולכן צריך שעבור מקרה כלשהו (שבסופו של דבר מתקיים) יוחזר ע"י f משהו שאינו תלוי בקריאה נוספת ל-f. פונקתיה איטרטיבית עדיפה על רקורסיה, כי כפי שרואים מהדברים הנ"ל, רקורסיה ממלאת את המחסנית, כלומר יקרה בזיכרון.
 

ג81

New member
טוב אני אמשיך ל-garbage collector

של dot.net. אז לפי מה שקראתי עליו, הוא עובד כך: כאשר נגמר המקום ב-heap, ה-GC מוצא את כל האובייקטים הנחוצים. הוא עושה זאת על-ידי כך שראשית הוא מסמן את ה-roots כישיגים,כאשר roots הם משתנים (ומצביעים) שנמצאים על המחסנית, משתנים סטטיים וגלובליים (שנמצאים כמובן על ה-Data Segment וגם את זה חשוב לדעת בראיונות), מצביעים שנמצאים ברגיסטרים של המעבד וכו'. dot.net כל הזמן מחזיק את רשימת ה-roots. לאחר-מכן הוא מוצא את כל המשתנים הישיגים מה-roots, כלומר אם נסמן את המשתנים כצמתים בגרף ואת הקשר "A מצביע ל או משתמש ב B" כקשר שעבורו נוצרת קשת, אז בעזרת BFS או DFS אפשר למצוא את כל הצמתים הישיגים בגרף הנ"ל. כמובן שאם ה-GC מגיע לצומת שכל הצמתים הישיגים ממנו כבר נתגלו, הוא לא ממשיך את החיפוש במסלול שממשיך דרך הצומת הזה (זה מונע מעגלים ומשפר ביצועים). לאחר שה-GC מצא את כל הצמתים הישיגים, אז הוא מצא בעצם את כל האובייקטים הנחוצים. לכן הוא יודע מה הם האובייקטים הלא נחוצים (האובייקטים שיושבים על ה-heap ואינם נחוצים) והוא יכול לנקות אותם מה-heap (כלומר לשחרר זיכרון). לאחר הניקוי הזה, נוצרים ב-heap חורים וה-GC מסדר את האובייקטים (ששרדו) כך שהם ישבו רצוף על ה-heap. יותר בפירוט, הסידור הזה על ה-heap נעשה כך: ה-heap מחולק ל-3 "דורות": דור 0, דור 1 ודור 2. בהתחלה כל האובייקטים שייכים לדור 0. לאחר שה-heap מתמלא, כל האובייקטים ששרדו עוברים לדור 1. מעכשיו כל האובייקטים החדשים מתווספים לדור 0. אם שוב ה-heap מתמלא אז עכשיו כל האובייקטים מדור 0 ששרדו עוברים לדור 1 וכל האובייקטים מדור 1 ששרדו עוברים לדור 2(כמובן שמכיוון שיש רק 3 דורות, כל מה שהיה בדור 2 ושורד נשאר מעכשיו בדור 2). היתרון של גישת הדורות הנ"ל היא שאפשר להתיחס באופן שונה לאובייקטים שיושבים בדורות שונים. כלומר, מכיוון שה-GC של dot.net מניח שאם אובייקט כלשהו שרד עד כה אז הוא ימשיך לשרוד ואם האובייקט הוא חדש אז כנראה שהוא יחיה זמן קצר, הוא יכול לבדוק את האובייקטים בדור 0 לעתים קרובות יותר מהאובייקטים בדור 1 ודור 2 וע"י כך לשפר ביצועים (לא צריך לבדוק את כל האובייקטים כל פעם ואלה שכן נבדקים, יש סבירות גבוהה שצריך להעיף אותם ולכן הם לא נבדקים לשווא). כמובן שהיתרון של GC הוא שהוא פותר לגמרי את המתכנת מאחריות לניהול זיכרון ומאפשר לו להתעסק בדברים יותר חשובים (כלומר בלוגיקה של האפליקציה שהוא כותב). בנוסף לחיסכון בזמן, נחסכים גם באגים (שגם הטיפול בהם עולה בזמן) כמו dangling pointers ודליפות זיכרון. החיסרון הוא שה-GC עלול להיות פחות יעיל מניהול ידני של זיכרון, כי הוא לא מכיר את הלוגיקה של התכנית. כמו-כן, מכיוון שהוא זורק את הזבל רק כשיש הרבה זבל (די דומה לאיך שזורקים זבל בבית), הוא עלול לגרום לעצירות ממושכות יותר בתכנית למטרת ניקוי זבל, במקום עצירות קצרות שהיו נגרמות בגלל שחרור של אובייקט אחד בלבד על-ידי המתכנת.
 

ג81

New member
ההבדל בין חוט ותהליך ו-deadlock

תהליך הוא מושג שקיים ברמת מערכת ההפעלה ולכל תהליך יש מרחב זיכרון (מחסנית, heap ו-Data Segment) משלו ומשאבים (למשל קבצים) משלו. לעומת זאת חוט הוא מושג שקיים ברמת התהליך, כלומר בכל תהליך יכולים להיות מספר חוטים. השוני בין חוט לחוט הוא ב-pc(program counter)ddd וב-sp (stack pointer)ddd וע"י כך חוטים שונים יכולים להריץ קוד שונה, כי ה-pc שלהם מצביע למקומות שונים ולחוטים שונים יכולות להיות מחסניות שונות (בגלל ה-sp השונים) ולכן המשתנים הלוקליים משתנים מחוט לחוט (שלא כמו משתנים גלובליים וסטטיים או מידע על ה-heap).
 

user32

Well-known member
מנהל
החלק המקצועי - פשוט מעולה

אני מודה שכעובד וותיק בענף והיום בתפקיד מראיין, כיסית פחות או יותר את הראיונות הנפוצים שנתקלים בהם. יש עוד סוג וזה הכרות עם טכנולוגיות, אבל זה באמת לאנשים מנוסים שמתמודדים על משרות עם נסיון. שאלות כמו איזה סוגי EJB אתה מכיר? או שאלה על פונקציות בADO דוט נט. אגב, הערה קטנה על Desing Patterns: אכן זהו תחום חביב על מראיינים כיוון שקל לגלות את מיומנות המועמד בתכנון וOOP דרך שאלות על הנושא הזה. דווקא הDP הנפוץ ביותר בראיונות הוא הFactory והSinglton ואישית הייתי ממליץ גם להכיר את Adaptor, Bridge וProxy
 

maximbu

New member
יום אחד ...

כשכבר יהיה לי נסיון ואני שוב אחפש עבודה אני בטח ארשום גם על זה (נכון לעכשיו אין לי מושג מה זה EJB אפילו או מה זה ADO). :) לגבי הדיסיין פאטרנס באמת נתתי לינקים ל2 אלו (אגב בינתיים לא שאלו אותי מעולם על factory מצד שני גם מעולם לא טענתי לדעת דסיין פאטרנס ורק כשהמראיין שאל אותי מפורשות האם אני מכיר את זה אז עניתי ב"קצת" וזה בטח פורש אצלו (למזלי) כ"לא , אבל למדתי את סינגלטון ואני מקווה שתבקש ממני לממש דווקא אותו" ואז נתבקשתי לממש דווקא סינגלטון :) )
 

kity02

New member
האם בתור מראיין - החלק של סינון

קורות החיים דומה בארץ למה שמתרחש בחו"ל בו נכתב המאמר הנוגע לסינון קורות חיים? אני סתם שולפת דוגמא: מחבר המאמר כתב שם שמסנן קורות חיים יחפש אנשים ש"אינם" שייכים לאותה קבוצה של המתכנתים כרגע, כדי להביא רעיונות יצירתיים לצורת החשיבה של הצוות. אחת הדוגמאות שלו היא "אמא שישבה בבית עד כה" - האם לאמא כזו יש סיכוי להגיע בארץ לראיון אם היא תציין שהיא אמא שישבה בבית עד כה?
 

inbal76

New member
המאמרים

באתר שלו בד"כ מצוינים ושווים קריאה, אבל באמת יש שם גם דברים שלא מתאימים לישראל, וגם דברים שלא מתאימים לכל המעסיקים בארה"ב בהכללה. שימי לב שבאותה פסקה מה שהוא כותב זה Specifically, I’m looking for מה שהוא מחפש זה לא בהכרח מה שכל או רוב האחרים מחפשים. לדעתי רוב המראיינים לא מחפשים גיוון חברתי לצוותים שלהם, אלא להיפך, מעדיפים אנשים עם רקע דומה (ובעיקר עם רקע דומה לזה של המראיין עצמו).
 

user32

Well-known member
מנהל
בדיוק הפוך

פה בארץ החשיבה היא ישראלית ובדרך כלל לטווח קצר. בצוות פיתוח כלשהו נוצר לחץ והעובדים לא מצליחים לעמוד במשימות. אז מחפשים מישהו להגדיל את הצוות. הראש צוות היה מעדיף לשבט את אחד העובדים אבל כיוון שעוד לא המציאו מכונה שעושה copy paste לבנאדם, הוא נאלץ לחפש עובד חדש. בדרך כלל הוא ינסה למצוא את האדם עם הנסיון והידע הקרוב ביותר למה שעושים בצוות לפעמים תוך קטנוניות מוגזמת (דרישות משרה שכוללות ידע ברכיבים וממשקים ממש ספציפיים). כמובן שיש גם יוצאים מן הכלל אבל לרוב זה המצב.
 

kity02

New member
אז אולי להתאמת המאמרים המוצלחים,

בעיקר בנושא כתיבת הקורות חיים, כדאי שמישהו מהמומחים כא, שגם עוסק בסינון קורות חיים, יתאר איך מסתכל מסנן ישראלי על קורות החיים. למען שלמות הנושא לטיגלון, כמובן...
 

0 אור 0

New member
בטאאאאח

משום מה בישראל בדרך כלל בונים איזה שטאנץ מסויים, ואז מגייסים לפיו, אמא שישבה בבית - אין לה בכלל סיכוי, אבל בתור אדם עם ידע ונסיון וכישורים, אני בפירוש נתקלתי במצבים שהיה ברור שאין לי סיכוי למשרה כי אני לא מתאימה לתדמית השבלונית שרואה המראיין. אתה רואה את זה בעיניים בשניה שאתה עומד בדלת, ופתאום העיניים שלו שציפו לגבר גבוה ושרירי 1.85 בלונדיני עם עיניים כחולות, מגלות אותי - שממש לא נראית ככה. זאת אומרת, אם הוא היה קורא את קורות החיים מן הסתם היה מבין שאני דוקא אשה ולפי שנות הנסיון כבר קשה לי להשאר בת 24 (לא שלא ניסיתי), אבל כבר סיכמנו שלא קוראים ...
 

IdleThought

New member
אמממ

גם כשאתה גבר בלונדיני שרירי עם עיניים כחולות וגבוה ( טוב.. 1.83) זה לא עולם הרבה יותר קל מנסיון
 
למעלה