שלום,
נראה שכבר הכרתם את אאוריקה. בטח כבר גיליתם כאן דברים מדהימים, אולי כבר שאלתם שאלות וקיבלתם תשובות טובות.
נשמח לראות משהו מכם בספר האורחים שלנו: איזו מילה טובה, חוות דעת, עצה חכמה לשיפור או כל מה שיש לכם לספר לנו על אאוריקה, כפי שאתם חווים אותה.
»
«
מהם האלגוריתמים של כולנו?
אם התפלאתם כיצד יודעים שירותים כמו ספוטיפיי או אפל מיוזיק להציע לכם שירים ואמנים שאינכם מכירים ולקלוע לטעם שלכם, או שנדהמתם מהסדרות והסרטים שנטפליקס מציע לכם לצפות בהם ומכמה שהם מתאימים לטעמכם, אם אתם נדהמים מזה שאתם מוקפים בפייסבוק באנשים שחושבים כמוכם, או הפוך, ממש בדיוק הפוך מכם - בכל המקרים הללו נראה שאתם מתפעלים מאלגוריתמים.
בכלל, זה העידן של האלגוריתמים, אותם חלקי תוכנות שמאפשרות לתוכנות ללמוד היטב את הטעם שלכם, הדיעות שלכם, ההתנהגות, החיפושים בגוגל ומה לא - הכל כדי לשרת אתכם היטב. טוב, לגבי החלק האחרון לא בטוח שהוא מדויק... בואו נאמר שהכל בעיקר כדי לשרת את הרווחים של התאגידים הללו ואת המשקיעים ובעלי המניות שלהם.
אבל רגע, מה הם אלגוריתמים בכלל?
אלגוריתם (Algorithm) הוא מתכון כללי לפתרון של בעיה כלשהי. מדובר במתכון שניתן להזין למחשב והוא יסייע לפתור אותה.
זהו רצף של הוראות לביצוע משימה או פתרון של בעיה מסוימת. אפשר לומר שאלגוריתם מציע סדרת הוראות וסדר ביצוע שמוגדר היטב. או במילים פשוטות, אלגוריתם הוא דרך שכוללת צעדים מדויקים ומסודרים לפי סדר, לביצוע משימה או לפתרון בעיה.
תכנית מחשב היא ייצוג בשפת תכנות, של אלגוריתם. היא מאפשרת להריץ את האלגוריתם על מחשב.
גם מי שלא מתעסקים במחשבים מכירים מחיי היום-יום אלגוריתמים פשוטים. למשל מתכונים למטבח (כן אדוני השף החובב - מתכון הוא אלגוריתם פשוט וקלאסי שכולנו משתמשים בו, אפילו כדי להכין חביתה). גם הוראות ההרכבה של איקאה או מדריכי DIY מספרי "עשה זאת בעצמך" הם אלגוריתמים.
ועדיין, לרוב משתמשים במונח "אלגוריתם" כדי לכנות פתרון מתמטי או דרך לביצוע של משימה בעולם המחשבים ומערכות דיגיטליות מתקדמות דומות.
משימות כמו התאמה של פריטים לפי טעם המשתמשים, מכירה מקוונת של מוצרים שאמזון מעריכה שסביר שתרצו לקנות, המלצה על שירים שיגרמו הנאה, או סרטים וסדרות כאלה, או חברים ופוסטים בפייסבוק שיביאו את המשתמש להגיב ולהיות מעורב בדיון - אלה רק דוגמאות.
אז כן. האלגוריתם הוא רכיב תוכנה שנועד לייצר פעולה מסוימת. אם כשהוא מכוון ללמוד אותנו, משתמשי התוכנה, האתר, האפליקציה או שירות כלשהו, אז הוא כבר הופך למכונה לומדת - משהו שמתעקש ללמוד עלינו דברים שאפילו אנחנו לא יודעים על עצמנו. זה הכוח של הכלי הזה ואת הכוח הזה הוא מעביר לבעליו.
כך יכולים התאגידים החזקים בעולם להתאים לנו פרסומות מטורגטות, שיפעילו אותנו ולכן יכניסו להם סכומי כסף אדירים. כך הם יכולים גם לסחור בידע שהאלגוריתמים הללו הקנו להם עלינו, כדי להרוויח הרבה יותר כסף ממה שהן מרוויחות כחברות המספקות תוכנה או שירותי אינטרנט.
אגב, ודאי יפתיע אתכם שהמילה הכל כך טרנדית ואופנתית הזו, "אלגוריתם", מקורה הוא משיבוש שמו של מוחמד אבן מוסא "אל-ח'וואריזמי", שהיה מתמטיקאי פרסי מהמאה ה-9.
הנה סרטון שמסביר בצורה פשוטה יחסית מהו אלגוריתם (מתורגם):
http://youtu.be/6hfOvs8pY1k
האלגוריתם הוא המלך בעולם המחשבים ולכן התכנות חייב להתחיל ממנו:
https://youtu.be/MRPpYX8SOA8
סוג של אלגוריתמים לפתרון הקוביה ההונגרית (עברית):
http://youtu.be/RQo8WoHQIz8
בחיוך מסוים - מסתבר שיש אלגוריתם אפילו לתרמילאים שרוצים לשרוד:
https://youtu.be/PQKOpvypN2Y
סרטון תיעודי על האלגוריתם ושליטתו בעידן המודרני:
https://youtu.be/FXTP0a1aaA4?long=yes
ותכנית חינוכית על אלגוריתמים (עברית):
https://youtu.be/nMJ8R9K9EQw?long=yes
אילו תכונות מאפיינות אלגוריתמים?
האלגוריתם הוא הדרך לפתרון בעיה אלגוריתמית. הוא הבסיס לתוכנת מחשב.
כשהוא בנוי נכון יש לאלגוריתם כמה תכונות:
#הוראות מסודרות
הוא מורכב מהוראות המוגדרות ברמת פירוט הנדרשת למבצע ההוראות. כל ההוראות חייבות להיות ברורות ואפשריות לביצוע.
#פתרון לכל נקודת מוצא
עליו לתת פתרון, או לפחות מענה, המתאימים לכל קלט חוקי שהוא מקבל בנקודת המוצא שלו.
#מספר סופי של צעדים
על האלגוריתם להיות בעל מספר סופי של צעדים מהבעיה לפתרון. בכל מקרה אחר הוא יהיה אינסופי ולפיכך לא יעיל.
הנה האלגוריתם ותכונותיו (מתורגם):
https://youtu.be/6hfOvs8pY1k
איך מייצגים אלגוריתמים?
אלגוריתם (Algorithm) הוא שם כללי להוראות ביצוע של משימה או דרך לפתור בעיה מוגדרת. זהו, אם תרצו, מתכון כללי בו מטופלת בעיה לצורך פתרונה.
אם אתם מנסים למצוא רצף של הוראות לביצוע משימה או לפתרון של בעיה מסוימת, הרי שאתם מחפשים אלגוריתם.
כמובן שמדובר במגוון אדיר של בעיות המחייבות ייצוג ולכן גם הדרכים מגוונות ואין דרך אחת. אם בכל זאת נצטמצם לעולם הטכנולוגיה והמחשבים, הרי שבכל זאת ניתן לייצג אלגוריתמים בכמה דרכים או שיטות.
אז הנה השיטות הבולטות ביותר לייצוג אלגוריתמים:
#תרשים זרימה
תצוגה גרפית של האלגוריתם, בעזרת תרשים כמו בתמונה שלמעלה, המכיל סימנים מקובלים וחלקים שונים באלגוריתם: נקודות התחלה וסיום - אליפסה, הצגת הוראות - מלבן, הוראות קלט פלט - מקבילית וביצוע מותנה של פעולות באלגוריתם - מעוין.
#ייצוג מילולי לאלגוריתם
כאן מתוארת סדרת ההוראות בשפה רגילה. דוגמה:
1. קבל שלושה מספרים.
2. חשב את הממוצע של המספרים.
3. הדפס את הממוצע שנמצא.
#פסאודו קוד (Pseudu code)
תיאור סדרת ההוראות במילים, אבל באופן שמזכיר שפת תכנות. זו דרך מעולה להציג ומשתמשים בה יותר ויותר כיום, כולל באתרי לימוד ובספרים. דוגמה:
1. קבל כקלט שלושה מספרים שלמים a, b, c
2. רשום את תוצאת (a+b+c)/3 במשתנה avg
3. הצג בפלט את ממוצע המספרים avg
מיהו אל-ח'ואריזמי ממציא האלגוריתם?
מהי פונקציה בתכנות?
מכירים את זה שאתם עושים שוב ושוב, כל יום או כל כמה שעות את אותה פעולה וזה נראה לכם לא הגיוני?
גם מתכנתים לא אוהבים לעשות שוב ושוב את אותה פעולה. לכן הם למשל משתמשים בלולאות (Loops). אבל יש מרכיב שחוסך עוד יותר עבודה וכתיבת קוד מיותר. כי מתכנתים אוהבים לשמור את הקוד שלהם DRY, קיצור של "don’t repeat yourself".
לרכיב מקצר העבודה הזה קוראים פונקציה (Function). הפונקציה היא פלא של ייעול. כל מטרתה היא "לקודד פעם אחת, להשתמש הרבה פעמים".
#אבל מהי פונקציה?
פונקציה היא קוד שמבצע פעולה. הרעיון בכתיבת פונקציה הוא לכתוב פעם אחת קוד והוא יחליף את הצורך לכתוב פעולות דומות שוב ושוב, במקומות שונים בתוכנה.
דמייני שאת מתכנתת פעם אחת קטע של קוד ואחרי כן קוראת לו בתוכנה, בכל פעם שצריך שהוא יבצע את תפקידו.
מדהים לא?
ואכן, פונקציה בתכנות היא מרכיב פשוט אבל משמעותי מאוד, המקל את הקידוד ואת הארגון הנכון של תכנית מחשב. כך הוא מקצר את הקוד, חוסך זמן ומקטין את האפשרויות לשגיאות.
כמו במכשיר מיקרוגל או במכונית, בפונקציה משתמשים בכל פעם שרוצים לבצע את הפעולה שהיא יודעת ותוכנתה לעשות. מכונית תסיע אותנו ומיקרו יחמם לנו או יפשיר את האוכל. כל אחד יודע כמה הם שיפרו את חיינו לעומת העולם שלפני המכונית או המיקרוגל.
במילים פשוטות, הפונקציה היא קטע קוד המבצע פעולה, Action כלשהי. המתכנתים כותבים את הפונקציה פעם אחת ויכולים לקרוא לה בקוד מתי שרק ירצו.
#שיטת התכנות של פונקציות
אז השיטה היא פשוטה - מגדירים ומשתמשים. כלומר, מתכנתים פונקציה ונותנים לה שם. מעתה נוכל להשתמש בה בקוד, כלומר לקרוא לה בכל פעם שנצטרך שהיא תבצע את תפקידה.
#איך פונקציה פועלת?
בקריאה לפונקציה, לעתים נצטרך לתת לה נתונים. בשביל זה לפונקציה יש סוגריים. בתוכן נצרף לה לעתים פרמטרים, כלומר נתונים מסויימים שבהם היא תשתמש כדי לחשב ולבצע את מה שהיא תוכנתה לעשות.
כשהפונקציה תסיים "לעבוד" (וזה יהיה מאוד מהיר כמובן) היא תחזיר את הפלט להמשך התכנית, או תבצע פעולה כמו הדפסה או הפעלה של פונקציות אחרות.
#דוגמה לפונקציות בחיים
נסביר את זה רגע בדימוי מהחיים: דמיינו שאתם בפסטיבל עם המון אנשים ואיבדתם את החברה שלכם. אתם ניגשים לבמה ומבקשים להכריז שאתם ממתינים לה. אומרים לכם לדבר עם שמעון, הכרוז של הפסטיבל. הוא בחור נחמד וענייני ומבקש מכם מידע, דאטה. במילים פשוטות - הוא שואל איך קוראים לה ומה שמכם. כשאתם נותנים את הפרטים הללו, שמעון ממהר להכריז במיקרופון "ברכה לוי, בואי ליד הבמה! יוסי ושרון ממתינים לך". דקות אחר כך ברכה מגיעה אליכם ליד הבמה.
סוף טוב הכל טוב!
כלומר, שמעון הוא פונקציה שיודעת להכריז על אבדות. הוא צריך פרמטרים, דאטה הכרחי שבדוגמה הזו הוא שם הגברת ושמות הממתינים לה. כשהוא מבצע את הפעולה שלו, המשימה מתבצעת. אם הוא היה מחזיר תשובה, כמו" ברכה כבר בבית" זה כנראה היה ארגומנט.
#יתרונות הפונקציה
פונקציה מקצרת את הקוד, חוסכת מאוד בזמן פיתוח ומונעת באגים. במילים פשוטות, הרעיון בפונקציה "קודד פעם אחת, השתמש הרבה פעמים!"
איך זה עובד?
דמיינו שהייתם צריכים גם לתקן בעצמכם את המכונית, גם להכין אוכל, גם לבנות את הבית שלכם, לטפל וללמד את הילדים, לתקן את החשמל, את הביוב וכל הדברים שצריך לעשות. אולי זה אפשרי אבל זה לא חכם, נכון?
קוד ללא פונקציות הוא כמו עולם בלי בעלי תפקידים שיודעים היטב כיצד למלא משימות מוגדרות, בלי אנשי מקצוע שהם מומחים בתפקידם ובלי מכשירים שעושים לנו את החיים קלים ונוחים.
זה עולם מסובך ומבולגן. המתכנתים קוראים לקוד כזה "קוד ספגטי". מרוב שהוא עמוס ומנוהל לא נכון, לא מוצאים בו את הידיים והרגליים...
חישבו על הפונקציה כסוג של מכונה, מתקן או חלק בקוד. כשנותנים להם סוג של אינפוט, מידע, הם יודעים לבצע במידע הזה משימה שהוגדרה להם מראש בתכנות.
פעולה כזו של פונקציה יכולה לפעמים לתת לנו משהו בחזרה, ערך או ערכים מוגדרים. ערך כזה בדוגמה שלנו הוא כמו תשובה ששמעון יכול לתת לנו, שברכה נמצאה וממתינה לנו במקום כלשהו.
לעתים פונקציה יכולה לשנות את הדאטה שנתנו לה ולפעמים לקבל החלטה על בסיס הדאטה הזה. בשפות מונחות עצמים יש בדרך כלל סוגריים אחרי שם הפונקציה. כשמכריזים על הפונקציה, כלומר כשמהמתכנתים מציגים אותה לראשונה, הם מגדירים שבסוגריים האלה יוכנס הדאטה לצורך הביצוע. בכך הם מגדירים באמצעות "פרמטרים" מה יהיה הדאטה המצופה, כדי שהפונקציה תעשה את תפקידה.
כשקוראים לפונקציה, זה כמו למלא טופס. לתוך הסוגריים, מכניסים את הפרמטרים, האינפוט, את המידע שהפונקציה רוצה (כמו ששמעון שואל "איך קוראים לילדה שנעלמה לכם?")
אחרי ביצוע הפעולה, הפונקציה תחזיר את הארגומנט. כלומר, את התוצאה או המידע שביקשנו ממנה לייצר מהפרמטרים שסיפקנו לה בקריאה.
בשפות תכנות נהוג שהסוגריים נכללות בפונקציה בכל מקרה, גם אם אין מידע, כלומר פרמטרים שהפונקציה דורשת כדי למלא את תפקידה, יהיו שם סוגריים ריקות.
ואגב, בשפות התכנות השונות יש פונקציות מובנות, שנכתבו מראש, ברמת השפה כולה. ניתן להשתמש בהן מראש, מבלי שהמתכנת יצטרך לפתח בעצמו או בעצמה פונקציות לדברים שמתכנתים צריכים הרבה. יש גם ספריות שלמות, שאותן תוכלו לייבא לקוד שלכם ולחסוך זמן פיתוח. הן כוללות פונקציות שימושיות, בתחום בו הספריה שימושית.
הנה סרטון שמסביר את הפונקציה בפשטות:
https://youtu.be/3JIZ40yuZL0?end=2m40s
הפונקציה לתלמידי תכנות שפת פייתון (עברית):
https://youtu.be/o0wyYsNbJeY
והסבר הפונקציות ב-javascript (עברית):
https://youtu.be/c7mqY6QtdQQ
מהי בעיית הסוכן הנוסע והאם קיים אלגוריתם לפתרונה?
דמיינו סוכן נוסע שהבוס נותן לו רשימה של ערים ודורש ממנו לתכנן את המסלול הכי קצר ביניהן, כך שיעבור פעם אחת בדיוק בכל עיר ואז ישוב לנקודה שממנה התחיל את המסלול.
המשימה הלכאורה פשוטה הזו היא אחת הבעיות המסובכות בעולם המדעי. היא זכתה לשם "בעיית הסוכן הנוסע" (Travelling Salesman Problem) ומטרתה היא אכן למצוא אלגוריתם שימצא את המסלול הקצר ביותר שיחבר כמה נקודות גאוגרפיות עד החזרה לנקודה שממנה מתחילים.
זו בעייה ידועה מאוד ומהנושאים המבוקשים ביותר לפתרון בעולם הניווט כיום. היא חברה מכובדת בקבוצת הבעיות נטולות הפתרון של תורת הגרפים ותורת הסיבוכיות. היא גם מהבעיות המרכזיות בתחום האופטימיזציה, כשגם אנשי בינה מלאכותית ומדעני מחשב עוסקים בה לא מעט.
מכיוון שהבעיה נוגעת גם למטיילים, דוורים, מתכנני טיסות לחוצים בכסף ושליחים של וולט עם מנות טייק אוויי חמות, היא זכתה גם לכינוי העממי "בעיית השליחים".
#הבעיה
דמיינו סוכן מכירות, שרוצה לפקוד את כל המקומות שבהם הוא אמור למכור את הסחורה שלו. האיש מעוניין למצוא את המסלול הקצר ביותר שיאפשר לו לעבור דרך כל המקומות, בכל מקום פעם אחת בלבד, ולסיים בנקודת ההתחלה.
זה פשוט, אתם ודאי אומרים לעצמכם. פשוט נמדוד על המפה את המרחקים בין כל שני מקומות במסלול ונסכם את המרחקים למרחק כולל. כך נמדוד בכמה מסלולים ונבחר את הקצר ביותר מהם.
אבל השיטה בה הולכים מנקודת ההתחלה לנקודה הקרובה ביותר, ממנה לנקודה הקרובה ביותר אליה וכך הלאה - השיטה הזו פשוט לא עובדת. במילים פשוטות, היא לא מציעה כך את המסלול הקצר ביותר.
דרכים אחרות? - בטח לא דרך ידנית.
רק שנבין כמה הבעיה מורכבת - פתרון בניסוי וטעייה הוא בלתי אפשרי כאן, כי אם יש לנו 10 נקודות בלבד, יש לה !N אפשרויות, N עצרת!, כלומר נצטרך להשוות
את המרחקים בלא פחות מ-3,628,800 אפשרויות או מסלולים אפשריים.
יותר מקומות? - זה רק יגדל. כדי שמחשב מהיר יעבור על כל האפשרויות שיש ל-100 יעדים, זה ייקח לו זמן בלתי סביר של 40 מיליון שנה עד שיגיע לתשובה.
#תולדות הבעיה
במאה ה-19 היו ראשונים שניסחו את בעיית הסוכן הנוסע, שבראשי תיבות מכונה TSP, המתמטיקאים ויליאם המילטון מאירלנד והמתמטיקאי הבריטי תומאס קירקמן (Thomas Kirkman).
ב-1857 המילטון אף פיתח את "משחק איקוסיאן" (Icosian game) שהמטרה בו הייתה למצוא את "המסלול ההמילטוני" שהוא הפתרון הקצר ביותר.
בשנת 1930, חוקר בשם קרל מנגר הגדיר את הבעיה והתייחס לפתרונות כוח גס ושיטת השכן הקרוב, אבל לא מצא פתרון.
בסנטה מניקה הציע תאגיד "ראנד", בשנות ה-50 וה-60 של המאה ה-20, פרסים על התקדמות, אפילו לא פתרון לבעיה. הדבר הפך את העניין לפופולרי מאוד, לפחות הצפון אמריקה ובאירופה. אבל שלל החוקרים, כולל מתמטיקאים, כימאים, פיזיקאים ואנשי מדעי המחשב, לא הניבו את הפתרון המיוחל. הבעייה נותרה ללא פתרון. המאבק היום הוא למצוא פתרון מקורב.
בשנת 2006 הצליחו לחקור ולוודא מסלול אופטימלי שעבר ב-85,900 נקודות. הוא מתוחזק ומאפשר מאז כלי בדיקה לאלגוריתמים שמציעים חוקרים לפתרון הבעיה.
#אז מה עושים?
השיטה הפשוטה היא הגרידית (Greedy). השיטה היא מכל נקודה ללכת אל הכי קרובה אליה.
שיטות אחרות בסרטונים שלמטה. הן לא מבטיחות את המסלול הקצר ביותר כמובן.
הנה אלגוריתם הסוכן הנוסע (עברית):
https://youtu.be/IUYaqz2hxN8
דוגמה להתמודדות עם חוט:
https://youtu.be/xi5dWND499g
כמה אסטרטגיות למסלול:
https://youtu.be/SC5CX8drAtU
בתכנות:
https://youtu.be/hvDx7q6vcWM
הסוכן הנוסע ובעיית ייעול המסלול (עברית):
https://youtu.be/MMt3I2P1j3I
ועוד הסבר על אלגוריתם קירוב ויעילותו (עברית):
https://youtu.be/9Uwp8NPdti0
למה כדאי ללמוד תכנות?
תכנות (Programming) הוא כתיבת קוד לתוכנה, או למה שאנו מכנים "תוכנות". בתכנות בונה המתכנת את התוכנה. לתכנות משתמש המתכנת בשפות תוכנה שונות.
לימוד תכנות הוא סוג מעולה של ספורט מנטלי ולוגי. הוא יכול לסייע ללומדים לשפר את ההיגיון שלהם ולהעצים את הכישורים שלהם ובכך הוא נותן כלים מעולים לחיים - גם למי שלא יהפכו למתכנתים.
לימוד התכנות משפר את החשיבה, היצירתיות, יכולת התכנון, הגילוי והסקרנות של המתכנת ולומד התכנות. יש יתרון אדיר לכל ילד וילדה שלומדים לתכנת וליצור באמצעות הטכנולוגיה והמחשבים. אבל הראשון שבהם אינו קשור אפילו במחשבים, אלא בכלי החשיבה, התכנון, הלוגיקה והסקת המסקנות (ואלה רק חלק), שהתכנות מלמד.
רבים ממייסדי החברות המצליחות והטובות בעולם למדו בילדותם תכנות, מה שפילס להם דרך לאחד התחומים המדהימים ביותר ביכולת ההשפעה שלו על העולם. מתכנת בודד יכול כיום לשנות את העולם. תשאלו את מארק צוקרברג, מייסד פייסבוק...
כיום, גם בתור ילדים, תוכלו להצטרף ולהתנסות בכתיבת קוד. זאת, אגב, גם אם אינכם מתכוונים ללמוד תכנות לעומק. תוכלו לעשות זאת באמצעות הצטרפות ל"שעת הקוד" - סוג של אירוע עולמי המאפשר לילדים להתנסות בשעה של תכנות וכתיבת קוד. כך תוכלו לחוות משהו מעולם ההייטק והחדשנות הטכנולוגית, אבל בלי להסתבך ובדרך של הנאה וחוויה. מארגני שעת הקוד מספרים שמעל 100 מיליון תלמידים מרחבי העולם השתתפו באירוע, מאז החלו אירועי שעת הקוד בעולם.
הנה התכנות שמשנה את העולם (עברית):
https://youtu.be/6_RFZr9mWvc
מה שבתי הספר, וזה חמור - לא מלמדים ילדים (מתורגם):
https://youtu.be/nKIu9yen5nc
הסברים של מה טוב בתכנות (בעברית):
https://youtu.be/hyCqL_lLDOQ
והסבר מלא על שלבי הלימוד בתכנות ללא קוד - וייב קודינג:
https://youtu.be/ISVtPqJsU-c?long=yes
מי המציא את האפס וכיצד הפך כל כך חשוב במתמטיקה?
האֶפֶס (Zero) שאנו משתמשים בו היום לא הגיע אלינו כהמצאה פתאומית של אדם בודד, אלא כתוצר של התפתחות הדרגתית שחצתה תרבויות ויבשות, עיצב את המתמטיקה, המדע והטכנולוגיה מהתרבויות העתיקות ועד לעידן הדיגיטלי.
ההתחלה, מראשית התרבות הייתה בלעדיו. מכיוון שמספרים שימשו רק לספירת עצמים מוחשיים, נעדר האפס אלפי ומאות שנים מהחשבון.
מערכות מספרים ללא אפס שימשו את התרבויות העתיקות, מהאימפריה הבבלית במסופוטמיה ועד האימפריה הרומית. הבבלים אמנם עשו צעד לקראת אפס והציגו מציין ראשוני שתפקידו לסמן בחשבון שלהם את הדימוי הראשון של ה"כלום".
מסע האפס מתחיל בהודו העתיקה, שם במאה ה-6 לספירה הופיעו הסימנים הראשונים המייחדים את האפס כמושג עצמאי.
בשנת 628, המתמטיקאי והאסטרונום ההודי בראהמגופטה (Brahmagupta) תיעד את האפס בחיבורו המפורסם "בראהמספהוטסידהאנטה" (Brahmasphutasiddhanta), שם כונה האפס "סוניה" (Sunya) - מילה שמשמעותה "ריק".
בתחילה, האפס לא נתפס כמספר ממש אלא כשומר מקום במערכת הספרות, שעזר להבחין בין מספרים כמו 52 ל-502.
מהודו התגלגל האפס לעולם הערבי, שם אימצו אותו המתמטיקאים וסימנו אותו כעיגול ריק שכונה "סיפר" (Sifr). מילה זו היא שהפכה בסופו של דבר ל"zero" בשפות המערביות. המתמטיקאי הפרסי אל-ח'ואריזמי (Al-Khwarizmi) תרם משמעותית להפצת רעיון האפס בעולם המדע של ימי הביניים.
אל אירופה הגיע האפס רק במאה ה-11 דרך אנדלוסיה, ספרד המוסלמית של אותם ימים. אך הייתה זו דמותו של פיבונאצ'י (Fibonacci), המתמטיקאי האיטלקי בן המאה ה-13, שעזרה להטמיע את האפס והספרות ההודו-ערביות בתרבות המערב.
האפס עיצב את המתמטיקה וחולל בו מהפכה אמיתית, ומעבר להיותו סמל טכני, הוא אפשר את יצירתה של מערכת המספרים העשרונית הפוזיציונלית. במערכת זו, למיקום של כל ספרה יש משמעות קריטית, והאפס מסייע להבדיל בין מספרים שונים. ללא האפס, היה בלתי אפשרי לפתח תחומים מתמטיים מתקדמים כמו אלגברה וחשבון אינפיניטסימלי.
התפתחות האפס כמספר עצמאי, ולא רק כסמל שמייצג חוסר, פתחה דלתות לתפיסות מתמטיות מורכבות. האפס מאפשר לפתור משוואות בסיסיות כמו x + 7 = 7, להבין את מושג הקבוצה הריקה, ולהגדיר גבולות במתמטיקה גבוהה. הוא גם משמש כנקודת מוצא בציר המספרים, המפרידה בין חיוביים לשליליים.
לאפס תכונות מתמטיות ייחודיות שמבדילות אותו מכל מספר אחר: הוא האיבר הניטרלי בפעולת החיבור, כך שכל מספר ועוד אפס שווה לעצמו. כל מספר כפול אפס שווה אפס. לעומת זאת, חלוקה באפס אינה מוגדרת כלל במתמטיקה. אחת התכונות המעניינות היא שכל מספר (שאינו אפס עצמו) בחזקת אפס שווה ל-1.
מעניין שלמרות חשיבותו, רבים מתקשים לתפוס את האפס כמספר "אמיתי" - אולי בגלל שהוא מסמל "שום דבר" בעולם המוחשי. קושי זה מופיע אצל ילדים לומדים אבל גם אצל מבוגרים, ומוביל לעתים לשגיאות בחשיבה מתמטית.
כבר מזמן הפך האפס ליסוד ולבסיס של המתמטיקה המודרנית והתפשט על פני תרבויות. אך בעולם הטכנולוגי של ימינו הפך מה שהתחיל כרעיון מופשט לציר האופן של העולם המודרני.
המחשבים שאנו משתמשים בהם מבוססים על שפה בינארית של אפסים ואחדים בלבד. ללא האפס, לא היה קיים העולם הדיגיטלי, הממוחשב, המקושר והמפותח כל כך וכל מה שמסביבו. כך, הפך מושג שהתחיל כסמל לריק והפך ליסוד שעליו נבנו המדע והטכנולוגיה העכשוויים.
הנה מושג האפס, או מהו האפס? (מתורגם)
https://youtu.be/9Y7gAzTMdMA
התפתחות האפס:
https://youtu.be/vIv1CoHwkTE
תולדות המתמטיקה העתיקה והמצאת האפס בידי ההודי ברהמהגופטה (עברית):
https://youtu.be/vOA4nelKn7s
חשיבות הגילוי של האפס או המצאתו:
https://youtu.be/oNeAhT5FMHs
פריצת הדרך שפתח האפס בעולם המתמטי:
https://youtu.be/D-oxsEknlIc
ותולדות האפס במתמטיקה:
https://youtu.be/z8_Xj-DIpTY
מי הייתה עדה לאבלייס, המתכנת הראשון בהיסטוריה?
כן, זו לא טעות... היא הייתה המתכנת הראשון של עולם המיחשוב. ולא סתם מתכנת אלא מתכנת שהקדים את זמנו - את התוכנה שכתבה, היא יצרה באמצע המאה ה-19, בערך 100 שנה לפני המצאת המחשב האלקטרוני...
כן, הסיפור מתחיל הרבה לפני שנולד המחשב הראשון. עדה לאבלייס (Ada Lovelace) האנגליה, או אדה לאבלייס, הייתה מתכנתת מחשבים מבלי שראתה מעודה מחשב. למעשה, "קוסמת המספרים" הזו כתבה את תוכנית המחשב הראשונה בהיסטוריה.
איך זה קורה? - ובכן, לאבלייס, או עדה ביירון, הייתה בתו של המשורר האנגלי הרומנטיקן וההולל לורד ביירון. היא הייתה מתמטיקאית צעירה ומבריקה, שהייתה האדם הנכון ובזמן המדויק לסייע לגאון אחר. בכך היא זכתה להיחשב לחלוצה בריטית בעולם המחשבים ולממציאת התכנות של מחשבים.
הכל מתחיל אצלה מלימוד מתמטיקה. את העידוד ללמוד מתמטיקה ומדעים היא קיבלה מאימה. האם גידלה אותה בחברה הגבוהה של לונדון והאמינה שפיתוח הכישורים המתמטיים של ביתה, ימנע ממנה להיות משוררת כמו אביה, איש שעזב את הבית עם לידתה.
ואכן, לאבלייס הוקסמה ממספרים ופיתחה חושים וכישרון מתמטי מדהים, תכונה יוצאת דופן לנשים ועוד פחות נפוץ אצל נערות באותה תקופה. מגיל צעיר למדה עדה בביתה מתמטיקה, עם מורים פרטיים שהזמינה אימה. המורים הללו חיבבו עליה את עולם המתמטיקה והיא ממש שיחקה במספרים.
בהיותה נערה, מורתה הפגישה אותם עם החוקר צ'ארלס באבג' (Babbage), מי שהיה פרופסור למתמטיקה וממציא. האיש פיתח כמה מכונות חישוב ועבודתו בתחום מכונות החישוב נחשבת למשפיעה מאד על התכנון של המחשבים המודרניים.
על המנוע האנליטי, אחת המכונות הללו שתכנן באבג', יצרה לאבלייס המסוקרנת, למרות גילה הצעיר, אלגוריתם שנועד לחשב מספרי ברנולי. האלגוריתם הזה נחשב לאלגוריתם הראשון, שפותח בכוונה לפעול על ידי מכונה. זה היה, כאמור, 100 שנה לפני המצאת המחשב האלקטרוני.
המדהים הוא שעל אף שבאבג’ לא הצליח להשלים את בניית המנוע האנליטי מעולם, עדה הבינה שהמכונה הזו היא סוג של מחשב. וזה עוד לפני שאחרים הבינו מהו מחשב.
בחזונה של לאבלייס, כשהמחשב הזה יפותח, הוא לא רק יחשב חישובים מתמטיים, אלא גם ילחין מוסיקה ויצייר. כבר אז היא כתבה שהמכונה של באבג' דומה לנול האריגה שהמציא ז'וזף מארי ז'קאר (Jacquard). הערכתה הייתה שכמו שהנול של ז'קרד יכול לארוג דוגמאות של עלים ופרחים, יארוג המנוע האנליטי של באבג' דגמים מתמטיים מרהיבים.
כמה שהיא צדקה.
לאבלייס שקדה על תרגום של מסמך שביקש ממנה באבג' לתרגם לאנגלית. בין ההסברים וההערות שהיא תרמה על המכונה של באבג', נוסף שם גם אותו אלגוריתם לחישוב מספרי ברנולי, שזוכה היום להיחשב לתכנית המחשב הראשונה בהיסטוריה.
משום כך רבים רואים בה את מתכנתת המחשבים הראשונה בעולם ולממציאת התכנות. ואגב, את כל זה היא עשתה עד גיל 36, בו הלכה עדה לעולמה ממחלת הסרטן.
בשנת 1979 ובאקט לא שובניסטי של פרגון גברי, קראו בפנטגון האמריקאי על שמה של עדה לאבלייס את שפת התכנות ADA, שפת מחשב המשמשת בעיקר תוכנות ומערכות הפעלה צבאיות.
הנה סיפורה של עדה לאבלייס (עברית):
https://youtu.be/td_5svpezpY?t=3m18s&end=5m32s
תולדות חייה:
https://youtu.be/U5VIiykV0LQ
ועדה לאבלייס הציעה בחייה את מה שנקרא היום מבחן לאבלייס לבינה מלאכותית (מתורגם):
https://youtu.be/Rh9vBczqMk0

אם התפלאתם כיצד יודעים שירותים כמו ספוטיפיי או אפל מיוזיק להציע לכם שירים ואמנים שאינכם מכירים ולקלוע לטעם שלכם, או שנדהמתם מהסדרות והסרטים שנטפליקס מציע לכם לצפות בהם ומכמה שהם מתאימים לטעמכם, אם אתם נדהמים מזה שאתם מוקפים בפייסבוק באנשים שחושבים כמוכם, או הפוך, ממש בדיוק הפוך מכם - בכל המקרים הללו נראה שאתם מתפעלים מאלגוריתמים.
בכלל, זה העידן של האלגוריתמים, אותם חלקי תוכנות שמאפשרות לתוכנות ללמוד היטב את הטעם שלכם, הדיעות שלכם, ההתנהגות, החיפושים בגוגל ומה לא - הכל כדי לשרת אתכם היטב. טוב, לגבי החלק האחרון לא בטוח שהוא מדויק... בואו נאמר שהכל בעיקר כדי לשרת את הרווחים של התאגידים הללו ואת המשקיעים ובעלי המניות שלהם.
אבל רגע, מה הם אלגוריתמים בכלל?
אלגוריתם (Algorithm) הוא מתכון כללי לפתרון של בעיה כלשהי. מדובר במתכון שניתן להזין למחשב והוא יסייע לפתור אותה.
זהו רצף של הוראות לביצוע משימה או פתרון של בעיה מסוימת. אפשר לומר שאלגוריתם מציע סדרת הוראות וסדר ביצוע שמוגדר היטב. או במילים פשוטות, אלגוריתם הוא דרך שכוללת צעדים מדויקים ומסודרים לפי סדר, לביצוע משימה או לפתרון בעיה.
תכנית מחשב היא ייצוג בשפת תכנות, של אלגוריתם. היא מאפשרת להריץ את האלגוריתם על מחשב.
גם מי שלא מתעסקים במחשבים מכירים מחיי היום-יום אלגוריתמים פשוטים. למשל מתכונים למטבח (כן אדוני השף החובב - מתכון הוא אלגוריתם פשוט וקלאסי שכולנו משתמשים בו, אפילו כדי להכין חביתה). גם הוראות ההרכבה של איקאה או מדריכי DIY מספרי "עשה זאת בעצמך" הם אלגוריתמים.
ועדיין, לרוב משתמשים במונח "אלגוריתם" כדי לכנות פתרון מתמטי או דרך לביצוע של משימה בעולם המחשבים ומערכות דיגיטליות מתקדמות דומות.
משימות כמו התאמה של פריטים לפי טעם המשתמשים, מכירה מקוונת של מוצרים שאמזון מעריכה שסביר שתרצו לקנות, המלצה על שירים שיגרמו הנאה, או סרטים וסדרות כאלה, או חברים ופוסטים בפייסבוק שיביאו את המשתמש להגיב ולהיות מעורב בדיון - אלה רק דוגמאות.
אז כן. האלגוריתם הוא רכיב תוכנה שנועד לייצר פעולה מסוימת. אם כשהוא מכוון ללמוד אותנו, משתמשי התוכנה, האתר, האפליקציה או שירות כלשהו, אז הוא כבר הופך למכונה לומדת - משהו שמתעקש ללמוד עלינו דברים שאפילו אנחנו לא יודעים על עצמנו. זה הכוח של הכלי הזה ואת הכוח הזה הוא מעביר לבעליו.
כך יכולים התאגידים החזקים בעולם להתאים לנו פרסומות מטורגטות, שיפעילו אותנו ולכן יכניסו להם סכומי כסף אדירים. כך הם יכולים גם לסחור בידע שהאלגוריתמים הללו הקנו להם עלינו, כדי להרוויח הרבה יותר כסף ממה שהן מרוויחות כחברות המספקות תוכנה או שירותי אינטרנט.
אגב, ודאי יפתיע אתכם שהמילה הכל כך טרנדית ואופנתית הזו, "אלגוריתם", מקורה הוא משיבוש שמו של מוחמד אבן מוסא "אל-ח'וואריזמי", שהיה מתמטיקאי פרסי מהמאה ה-9.
הנה סרטון שמסביר בצורה פשוטה יחסית מהו אלגוריתם (מתורגם):
http://youtu.be/6hfOvs8pY1k
האלגוריתם הוא המלך בעולם המחשבים ולכן התכנות חייב להתחיל ממנו:
https://youtu.be/MRPpYX8SOA8
סוג של אלגוריתמים לפתרון הקוביה ההונגרית (עברית):
http://youtu.be/RQo8WoHQIz8
בחיוך מסוים - מסתבר שיש אלגוריתם אפילו לתרמילאים שרוצים לשרוד:
https://youtu.be/PQKOpvypN2Y
סרטון תיעודי על האלגוריתם ושליטתו בעידן המודרני:
https://youtu.be/FXTP0a1aaA4?long=yes
ותכנית חינוכית על אלגוריתמים (עברית):
https://youtu.be/nMJ8R9K9EQw?long=yes

האלגוריתם הוא הדרך לפתרון בעיה אלגוריתמית. הוא הבסיס לתוכנת מחשב.
כשהוא בנוי נכון יש לאלגוריתם כמה תכונות:
#הוראות מסודרות
הוא מורכב מהוראות המוגדרות ברמת פירוט הנדרשת למבצע ההוראות. כל ההוראות חייבות להיות ברורות ואפשריות לביצוע.
#פתרון לכל נקודת מוצא
עליו לתת פתרון, או לפחות מענה, המתאימים לכל קלט חוקי שהוא מקבל בנקודת המוצא שלו.
#מספר סופי של צעדים
על האלגוריתם להיות בעל מספר סופי של צעדים מהבעיה לפתרון. בכל מקרה אחר הוא יהיה אינסופי ולפיכך לא יעיל.
הנה האלגוריתם ותכונותיו (מתורגם):
https://youtu.be/6hfOvs8pY1k

אלגוריתם (Algorithm) הוא שם כללי להוראות ביצוע של משימה או דרך לפתור בעיה מוגדרת. זהו, אם תרצו, מתכון כללי בו מטופלת בעיה לצורך פתרונה.
אם אתם מנסים למצוא רצף של הוראות לביצוע משימה או לפתרון של בעיה מסוימת, הרי שאתם מחפשים אלגוריתם.
כמובן שמדובר במגוון אדיר של בעיות המחייבות ייצוג ולכן גם הדרכים מגוונות ואין דרך אחת. אם בכל זאת נצטמצם לעולם הטכנולוגיה והמחשבים, הרי שבכל זאת ניתן לייצג אלגוריתמים בכמה דרכים או שיטות.
אז הנה השיטות הבולטות ביותר לייצוג אלגוריתמים:
#תרשים זרימה
תצוגה גרפית של האלגוריתם, בעזרת תרשים כמו בתמונה שלמעלה, המכיל סימנים מקובלים וחלקים שונים באלגוריתם: נקודות התחלה וסיום - אליפסה, הצגת הוראות - מלבן, הוראות קלט פלט - מקבילית וביצוע מותנה של פעולות באלגוריתם - מעוין.
#ייצוג מילולי לאלגוריתם
כאן מתוארת סדרת ההוראות בשפה רגילה. דוגמה:
1. קבל שלושה מספרים.
2. חשב את הממוצע של המספרים.
3. הדפס את הממוצע שנמצא.
#פסאודו קוד (Pseudu code)
תיאור סדרת ההוראות במילים, אבל באופן שמזכיר שפת תכנות. זו דרך מעולה להציג ומשתמשים בה יותר ויותר כיום, כולל באתרי לימוד ובספרים. דוגמה:
1. קבל כקלט שלושה מספרים שלמים a, b, c
2. רשום את תוצאת (a+b+c)/3 במשתנה avg
3. הצג בפלט את ממוצע המספרים avg

מיהו ממציא האלגוריתם?
כל מי שמתחבר היום לאינטרנט ודאי יתעניין לדעת שחוקר ערבי מהמאה ה-9 הוא שהמציא את אחד הכלים החשובים בעידן המחשבים המודרניים של המאה ה-21.
קראו לו מוחמד אבן מוסא אל-ח'ואריזמי (Muhammad ibn Musa al-Khwarizmi) או בקיצור אל-ח'ואריזמי (al-Khwarizmi). שיבוש או פישוט שמו לשפות אירופאיות הפך את אל-ח'ואריזמי לשם "אל-גוריתם", שבימינו הוא כבר מילה אחת והיא "אלגוריתם".
הוא היה אחד מגדולי החוקרים במדע המוקדם. אמנם שפת אימו הייתה פרסית אך עבודתו המדעית נכתבה בערבית, שפת המדע בתקופתו. ספריו המתורגמים ללטינית היו מהמשפיעים והחשובים במדע האירופי וספר האלגברה שכתב היה מספרי הלימוד והמחקר החשובים באוניברסיטאות אירופה עד המאה ה-16.
מתמטיקאי, אסטרונום וגיאוגרף, אל-חואריזמי נולד בשנת 780 בערך בעיר חיווה שבאוזבקיסטן של היום. משם עברה משפחתו להתגורר באזור בגדאד, שם פעל אל-ח'ואריזמי כל חייו ופרסם את רוב כתביו.
אז מי ששיבוש שמו בתרגום ללטינית הפך לאחד המושגים החשובים בתחום המחשב המודרני - מושג האלגוריתם, הוא גם זה שפיתח את תורת האלגברה, עוד מילה שנולדה משיבוש השם של ספרו "חיסאב אל-ג'אבר ואל-מוקאבלה" ("חשבון ההשלמה וההקבלה"). גם כאן הפך "אל ג'אבר" ל"אלגברה".
אל-ח'ואריזמי הוא שהפיץ את השימוש בספרה אפס ותרם בכך תרומה עצומה לשימוש בספרות המוכרות לנו כספרות החשבון. כן, ספרות החשבון שמשמשות אותנו הן הספרות ההודיות-ערביות שהחליפו את הספרות הרומיות העתיקות.
כגיאוגרף פעיל הוא שכלל את מחקריו של תלמי היווני ובהמשך יצר את מפת העולם הראשונה, בעזרת 70 גאוגרפים שעבדו תחתיו.
כאסטרונום חקר אל חואריזמי את האצטרולב ושעון השמש. לאות כבוד קראו על שמו את מכתש "אל-ח'ואריזמי" שעל הירח.
הנה סיפורו של ממציא האלגוריתם:
https://youtu.be/oRkNaF0QvnI
תולדות חייו של חוואריזמי:
https://youtu.be/oyhOlGsDXP8
הוא גם המציא את האלגברה:
https://youtu.be/Ok5BGimzUkg
אל חוואריזמי הוא רק אחד מגדולי המדע המוסלמי:
https://youtu.be/s_Z3fbDw838
מצגת על ממציא האלגוריתם:
https://youtu.be/bNttn4oy3YU
הרצאת וידאו קצרה על האיש:
https://youtu.be/Ar7CNsJUm58
ודוגמה לאלגוריתם שפותר בעיה של שידוך בין שני צדדים, אלגוריתם השידוך היציב (עברית):
https://youtu.be/-sdjDmS-hCw
כל מי שמתחבר היום לאינטרנט ודאי יתעניין לדעת שחוקר ערבי מהמאה ה-9 הוא שהמציא את אחד הכלים החשובים בעידן המחשבים המודרניים של המאה ה-21.
קראו לו מוחמד אבן מוסא אל-ח'ואריזמי (Muhammad ibn Musa al-Khwarizmi) או בקיצור אל-ח'ואריזמי (al-Khwarizmi). שיבוש או פישוט שמו לשפות אירופאיות הפך את אל-ח'ואריזמי לשם "אל-גוריתם", שבימינו הוא כבר מילה אחת והיא "אלגוריתם".
הוא היה אחד מגדולי החוקרים במדע המוקדם. אמנם שפת אימו הייתה פרסית אך עבודתו המדעית נכתבה בערבית, שפת המדע בתקופתו. ספריו המתורגמים ללטינית היו מהמשפיעים והחשובים במדע האירופי וספר האלגברה שכתב היה מספרי הלימוד והמחקר החשובים באוניברסיטאות אירופה עד המאה ה-16.
מתמטיקאי, אסטרונום וגיאוגרף, אל-חואריזמי נולד בשנת 780 בערך בעיר חיווה שבאוזבקיסטן של היום. משם עברה משפחתו להתגורר באזור בגדאד, שם פעל אל-ח'ואריזמי כל חייו ופרסם את רוב כתביו.
אז מי ששיבוש שמו בתרגום ללטינית הפך לאחד המושגים החשובים בתחום המחשב המודרני - מושג האלגוריתם, הוא גם זה שפיתח את תורת האלגברה, עוד מילה שנולדה משיבוש השם של ספרו "חיסאב אל-ג'אבר ואל-מוקאבלה" ("חשבון ההשלמה וההקבלה"). גם כאן הפך "אל ג'אבר" ל"אלגברה".
אל-ח'ואריזמי הוא שהפיץ את השימוש בספרה אפס ותרם בכך תרומה עצומה לשימוש בספרות המוכרות לנו כספרות החשבון. כן, ספרות החשבון שמשמשות אותנו הן הספרות ההודיות-ערביות שהחליפו את הספרות הרומיות העתיקות.
כגיאוגרף פעיל הוא שכלל את מחקריו של תלמי היווני ובהמשך יצר את מפת העולם הראשונה, בעזרת 70 גאוגרפים שעבדו תחתיו.
כאסטרונום חקר אל חואריזמי את האצטרולב ושעון השמש. לאות כבוד קראו על שמו את מכתש "אל-ח'ואריזמי" שעל הירח.
הנה סיפורו של ממציא האלגוריתם:
https://youtu.be/oRkNaF0QvnI
תולדות חייו של חוואריזמי:
https://youtu.be/oyhOlGsDXP8
הוא גם המציא את האלגברה:
https://youtu.be/Ok5BGimzUkg
אל חוואריזמי הוא רק אחד מגדולי המדע המוסלמי:
https://youtu.be/s_Z3fbDw838
מצגת על ממציא האלגוריתם:
https://youtu.be/bNttn4oy3YU
הרצאת וידאו קצרה על האיש:
https://youtu.be/Ar7CNsJUm58
ודוגמה לאלגוריתם שפותר בעיה של שידוך בין שני צדדים, אלגוריתם השידוך היציב (עברית):
https://youtu.be/-sdjDmS-hCw
אלגוריתמיקה

מכירים את זה שאתם עושים שוב ושוב, כל יום או כל כמה שעות את אותה פעולה וזה נראה לכם לא הגיוני?
גם מתכנתים לא אוהבים לעשות שוב ושוב את אותה פעולה. לכן הם למשל משתמשים בלולאות (Loops). אבל יש מרכיב שחוסך עוד יותר עבודה וכתיבת קוד מיותר. כי מתכנתים אוהבים לשמור את הקוד שלהם DRY, קיצור של "don’t repeat yourself".
לרכיב מקצר העבודה הזה קוראים פונקציה (Function). הפונקציה היא פלא של ייעול. כל מטרתה היא "לקודד פעם אחת, להשתמש הרבה פעמים".
#אבל מהי פונקציה?
פונקציה היא קוד שמבצע פעולה. הרעיון בכתיבת פונקציה הוא לכתוב פעם אחת קוד והוא יחליף את הצורך לכתוב פעולות דומות שוב ושוב, במקומות שונים בתוכנה.
דמייני שאת מתכנתת פעם אחת קטע של קוד ואחרי כן קוראת לו בתוכנה, בכל פעם שצריך שהוא יבצע את תפקידו.
מדהים לא?
ואכן, פונקציה בתכנות היא מרכיב פשוט אבל משמעותי מאוד, המקל את הקידוד ואת הארגון הנכון של תכנית מחשב. כך הוא מקצר את הקוד, חוסך זמן ומקטין את האפשרויות לשגיאות.
כמו במכשיר מיקרוגל או במכונית, בפונקציה משתמשים בכל פעם שרוצים לבצע את הפעולה שהיא יודעת ותוכנתה לעשות. מכונית תסיע אותנו ומיקרו יחמם לנו או יפשיר את האוכל. כל אחד יודע כמה הם שיפרו את חיינו לעומת העולם שלפני המכונית או המיקרוגל.
במילים פשוטות, הפונקציה היא קטע קוד המבצע פעולה, Action כלשהי. המתכנתים כותבים את הפונקציה פעם אחת ויכולים לקרוא לה בקוד מתי שרק ירצו.
#שיטת התכנות של פונקציות
אז השיטה היא פשוטה - מגדירים ומשתמשים. כלומר, מתכנתים פונקציה ונותנים לה שם. מעתה נוכל להשתמש בה בקוד, כלומר לקרוא לה בכל פעם שנצטרך שהיא תבצע את תפקידה.
#איך פונקציה פועלת?
בקריאה לפונקציה, לעתים נצטרך לתת לה נתונים. בשביל זה לפונקציה יש סוגריים. בתוכן נצרף לה לעתים פרמטרים, כלומר נתונים מסויימים שבהם היא תשתמש כדי לחשב ולבצע את מה שהיא תוכנתה לעשות.
כשהפונקציה תסיים "לעבוד" (וזה יהיה מאוד מהיר כמובן) היא תחזיר את הפלט להמשך התכנית, או תבצע פעולה כמו הדפסה או הפעלה של פונקציות אחרות.
#דוגמה לפונקציות בחיים
נסביר את זה רגע בדימוי מהחיים: דמיינו שאתם בפסטיבל עם המון אנשים ואיבדתם את החברה שלכם. אתם ניגשים לבמה ומבקשים להכריז שאתם ממתינים לה. אומרים לכם לדבר עם שמעון, הכרוז של הפסטיבל. הוא בחור נחמד וענייני ומבקש מכם מידע, דאטה. במילים פשוטות - הוא שואל איך קוראים לה ומה שמכם. כשאתם נותנים את הפרטים הללו, שמעון ממהר להכריז במיקרופון "ברכה לוי, בואי ליד הבמה! יוסי ושרון ממתינים לך". דקות אחר כך ברכה מגיעה אליכם ליד הבמה.
סוף טוב הכל טוב!
כלומר, שמעון הוא פונקציה שיודעת להכריז על אבדות. הוא צריך פרמטרים, דאטה הכרחי שבדוגמה הזו הוא שם הגברת ושמות הממתינים לה. כשהוא מבצע את הפעולה שלו, המשימה מתבצעת. אם הוא היה מחזיר תשובה, כמו" ברכה כבר בבית" זה כנראה היה ארגומנט.
#יתרונות הפונקציה
פונקציה מקצרת את הקוד, חוסכת מאוד בזמן פיתוח ומונעת באגים. במילים פשוטות, הרעיון בפונקציה "קודד פעם אחת, השתמש הרבה פעמים!"
איך זה עובד?
דמיינו שהייתם צריכים גם לתקן בעצמכם את המכונית, גם להכין אוכל, גם לבנות את הבית שלכם, לטפל וללמד את הילדים, לתקן את החשמל, את הביוב וכל הדברים שצריך לעשות. אולי זה אפשרי אבל זה לא חכם, נכון?
קוד ללא פונקציות הוא כמו עולם בלי בעלי תפקידים שיודעים היטב כיצד למלא משימות מוגדרות, בלי אנשי מקצוע שהם מומחים בתפקידם ובלי מכשירים שעושים לנו את החיים קלים ונוחים.
זה עולם מסובך ומבולגן. המתכנתים קוראים לקוד כזה "קוד ספגטי". מרוב שהוא עמוס ומנוהל לא נכון, לא מוצאים בו את הידיים והרגליים...
חישבו על הפונקציה כסוג של מכונה, מתקן או חלק בקוד. כשנותנים להם סוג של אינפוט, מידע, הם יודעים לבצע במידע הזה משימה שהוגדרה להם מראש בתכנות.
פעולה כזו של פונקציה יכולה לפעמים לתת לנו משהו בחזרה, ערך או ערכים מוגדרים. ערך כזה בדוגמה שלנו הוא כמו תשובה ששמעון יכול לתת לנו, שברכה נמצאה וממתינה לנו במקום כלשהו.
לעתים פונקציה יכולה לשנות את הדאטה שנתנו לה ולפעמים לקבל החלטה על בסיס הדאטה הזה. בשפות מונחות עצמים יש בדרך כלל סוגריים אחרי שם הפונקציה. כשמכריזים על הפונקציה, כלומר כשמהמתכנתים מציגים אותה לראשונה, הם מגדירים שבסוגריים האלה יוכנס הדאטה לצורך הביצוע. בכך הם מגדירים באמצעות "פרמטרים" מה יהיה הדאטה המצופה, כדי שהפונקציה תעשה את תפקידה.
כשקוראים לפונקציה, זה כמו למלא טופס. לתוך הסוגריים, מכניסים את הפרמטרים, האינפוט, את המידע שהפונקציה רוצה (כמו ששמעון שואל "איך קוראים לילדה שנעלמה לכם?")
אחרי ביצוע הפעולה, הפונקציה תחזיר את הארגומנט. כלומר, את התוצאה או המידע שביקשנו ממנה לייצר מהפרמטרים שסיפקנו לה בקריאה.
בשפות תכנות נהוג שהסוגריים נכללות בפונקציה בכל מקרה, גם אם אין מידע, כלומר פרמטרים שהפונקציה דורשת כדי למלא את תפקידה, יהיו שם סוגריים ריקות.
ואגב, בשפות התכנות השונות יש פונקציות מובנות, שנכתבו מראש, ברמת השפה כולה. ניתן להשתמש בהן מראש, מבלי שהמתכנת יצטרך לפתח בעצמו או בעצמה פונקציות לדברים שמתכנתים צריכים הרבה. יש גם ספריות שלמות, שאותן תוכלו לייבא לקוד שלכם ולחסוך זמן פיתוח. הן כוללות פונקציות שימושיות, בתחום בו הספריה שימושית.
הנה סרטון שמסביר את הפונקציה בפשטות:
https://youtu.be/3JIZ40yuZL0?end=2m40s
הפונקציה לתלמידי תכנות שפת פייתון (עברית):
https://youtu.be/o0wyYsNbJeY
והסבר הפונקציות ב-javascript (עברית):
https://youtu.be/c7mqY6QtdQQ

דמיינו סוכן נוסע שהבוס נותן לו רשימה של ערים ודורש ממנו לתכנן את המסלול הכי קצר ביניהן, כך שיעבור פעם אחת בדיוק בכל עיר ואז ישוב לנקודה שממנה התחיל את המסלול.
המשימה הלכאורה פשוטה הזו היא אחת הבעיות המסובכות בעולם המדעי. היא זכתה לשם "בעיית הסוכן הנוסע" (Travelling Salesman Problem) ומטרתה היא אכן למצוא אלגוריתם שימצא את המסלול הקצר ביותר שיחבר כמה נקודות גאוגרפיות עד החזרה לנקודה שממנה מתחילים.
זו בעייה ידועה מאוד ומהנושאים המבוקשים ביותר לפתרון בעולם הניווט כיום. היא חברה מכובדת בקבוצת הבעיות נטולות הפתרון של תורת הגרפים ותורת הסיבוכיות. היא גם מהבעיות המרכזיות בתחום האופטימיזציה, כשגם אנשי בינה מלאכותית ומדעני מחשב עוסקים בה לא מעט.
מכיוון שהבעיה נוגעת גם למטיילים, דוורים, מתכנני טיסות לחוצים בכסף ושליחים של וולט עם מנות טייק אוויי חמות, היא זכתה גם לכינוי העממי "בעיית השליחים".
#הבעיה
דמיינו סוכן מכירות, שרוצה לפקוד את כל המקומות שבהם הוא אמור למכור את הסחורה שלו. האיש מעוניין למצוא את המסלול הקצר ביותר שיאפשר לו לעבור דרך כל המקומות, בכל מקום פעם אחת בלבד, ולסיים בנקודת ההתחלה.
זה פשוט, אתם ודאי אומרים לעצמכם. פשוט נמדוד על המפה את המרחקים בין כל שני מקומות במסלול ונסכם את המרחקים למרחק כולל. כך נמדוד בכמה מסלולים ונבחר את הקצר ביותר מהם.
אבל השיטה בה הולכים מנקודת ההתחלה לנקודה הקרובה ביותר, ממנה לנקודה הקרובה ביותר אליה וכך הלאה - השיטה הזו פשוט לא עובדת. במילים פשוטות, היא לא מציעה כך את המסלול הקצר ביותר.
דרכים אחרות? - בטח לא דרך ידנית.
רק שנבין כמה הבעיה מורכבת - פתרון בניסוי וטעייה הוא בלתי אפשרי כאן, כי אם יש לנו 10 נקודות בלבד, יש לה !N אפשרויות, N עצרת!, כלומר נצטרך להשוות
את המרחקים בלא פחות מ-3,628,800 אפשרויות או מסלולים אפשריים.
יותר מקומות? - זה רק יגדל. כדי שמחשב מהיר יעבור על כל האפשרויות שיש ל-100 יעדים, זה ייקח לו זמן בלתי סביר של 40 מיליון שנה עד שיגיע לתשובה.
#תולדות הבעיה
במאה ה-19 היו ראשונים שניסחו את בעיית הסוכן הנוסע, שבראשי תיבות מכונה TSP, המתמטיקאים ויליאם המילטון מאירלנד והמתמטיקאי הבריטי תומאס קירקמן (Thomas Kirkman).
ב-1857 המילטון אף פיתח את "משחק איקוסיאן" (Icosian game) שהמטרה בו הייתה למצוא את "המסלול ההמילטוני" שהוא הפתרון הקצר ביותר.
בשנת 1930, חוקר בשם קרל מנגר הגדיר את הבעיה והתייחס לפתרונות כוח גס ושיטת השכן הקרוב, אבל לא מצא פתרון.
בסנטה מניקה הציע תאגיד "ראנד", בשנות ה-50 וה-60 של המאה ה-20, פרסים על התקדמות, אפילו לא פתרון לבעיה. הדבר הפך את העניין לפופולרי מאוד, לפחות הצפון אמריקה ובאירופה. אבל שלל החוקרים, כולל מתמטיקאים, כימאים, פיזיקאים ואנשי מדעי המחשב, לא הניבו את הפתרון המיוחל. הבעייה נותרה ללא פתרון. המאבק היום הוא למצוא פתרון מקורב.
בשנת 2006 הצליחו לחקור ולוודא מסלול אופטימלי שעבר ב-85,900 נקודות. הוא מתוחזק ומאפשר מאז כלי בדיקה לאלגוריתמים שמציעים חוקרים לפתרון הבעיה.
#אז מה עושים?
השיטה הפשוטה היא הגרידית (Greedy). השיטה היא מכל נקודה ללכת אל הכי קרובה אליה.
שיטות אחרות בסרטונים שלמטה. הן לא מבטיחות את המסלול הקצר ביותר כמובן.
הנה אלגוריתם הסוכן הנוסע (עברית):
https://youtu.be/IUYaqz2hxN8
דוגמה להתמודדות עם חוט:
https://youtu.be/xi5dWND499g
כמה אסטרטגיות למסלול:
https://youtu.be/SC5CX8drAtU
בתכנות:
https://youtu.be/hvDx7q6vcWM
הסוכן הנוסע ובעיית ייעול המסלול (עברית):
https://youtu.be/MMt3I2P1j3I
ועוד הסבר על אלגוריתם קירוב ויעילותו (עברית):
https://youtu.be/9Uwp8NPdti0

תכנות (Programming) הוא כתיבת קוד לתוכנה, או למה שאנו מכנים "תוכנות". בתכנות בונה המתכנת את התוכנה. לתכנות משתמש המתכנת בשפות תוכנה שונות.
לימוד תכנות הוא סוג מעולה של ספורט מנטלי ולוגי. הוא יכול לסייע ללומדים לשפר את ההיגיון שלהם ולהעצים את הכישורים שלהם ובכך הוא נותן כלים מעולים לחיים - גם למי שלא יהפכו למתכנתים.
לימוד התכנות משפר את החשיבה, היצירתיות, יכולת התכנון, הגילוי והסקרנות של המתכנת ולומד התכנות. יש יתרון אדיר לכל ילד וילדה שלומדים לתכנת וליצור באמצעות הטכנולוגיה והמחשבים. אבל הראשון שבהם אינו קשור אפילו במחשבים, אלא בכלי החשיבה, התכנון, הלוגיקה והסקת המסקנות (ואלה רק חלק), שהתכנות מלמד.
רבים ממייסדי החברות המצליחות והטובות בעולם למדו בילדותם תכנות, מה שפילס להם דרך לאחד התחומים המדהימים ביותר ביכולת ההשפעה שלו על העולם. מתכנת בודד יכול כיום לשנות את העולם. תשאלו את מארק צוקרברג, מייסד פייסבוק...
כיום, גם בתור ילדים, תוכלו להצטרף ולהתנסות בכתיבת קוד. זאת, אגב, גם אם אינכם מתכוונים ללמוד תכנות לעומק. תוכלו לעשות זאת באמצעות הצטרפות ל"שעת הקוד" - סוג של אירוע עולמי המאפשר לילדים להתנסות בשעה של תכנות וכתיבת קוד. כך תוכלו לחוות משהו מעולם ההייטק והחדשנות הטכנולוגית, אבל בלי להסתבך ובדרך של הנאה וחוויה. מארגני שעת הקוד מספרים שמעל 100 מיליון תלמידים מרחבי העולם השתתפו באירוע, מאז החלו אירועי שעת הקוד בעולם.
הנה התכנות שמשנה את העולם (עברית):
https://youtu.be/6_RFZr9mWvc
מה שבתי הספר, וזה חמור - לא מלמדים ילדים (מתורגם):
https://youtu.be/nKIu9yen5nc
הסברים של מה טוב בתכנות (בעברית):
https://youtu.be/hyCqL_lLDOQ
והסבר מלא על שלבי הלימוד בתכנות ללא קוד - וייב קודינג:
https://youtu.be/ISVtPqJsU-c?long=yes

האֶפֶס (Zero) שאנו משתמשים בו היום לא הגיע אלינו כהמצאה פתאומית של אדם בודד, אלא כתוצר של התפתחות הדרגתית שחצתה תרבויות ויבשות, עיצב את המתמטיקה, המדע והטכנולוגיה מהתרבויות העתיקות ועד לעידן הדיגיטלי.
ההתחלה, מראשית התרבות הייתה בלעדיו. מכיוון שמספרים שימשו רק לספירת עצמים מוחשיים, נעדר האפס אלפי ומאות שנים מהחשבון.
מערכות מספרים ללא אפס שימשו את התרבויות העתיקות, מהאימפריה הבבלית במסופוטמיה ועד האימפריה הרומית. הבבלים אמנם עשו צעד לקראת אפס והציגו מציין ראשוני שתפקידו לסמן בחשבון שלהם את הדימוי הראשון של ה"כלום".
מסע האפס מתחיל בהודו העתיקה, שם במאה ה-6 לספירה הופיעו הסימנים הראשונים המייחדים את האפס כמושג עצמאי.
בשנת 628, המתמטיקאי והאסטרונום ההודי בראהמגופטה (Brahmagupta) תיעד את האפס בחיבורו המפורסם "בראהמספהוטסידהאנטה" (Brahmasphutasiddhanta), שם כונה האפס "סוניה" (Sunya) - מילה שמשמעותה "ריק".
בתחילה, האפס לא נתפס כמספר ממש אלא כשומר מקום במערכת הספרות, שעזר להבחין בין מספרים כמו 52 ל-502.
מהודו התגלגל האפס לעולם הערבי, שם אימצו אותו המתמטיקאים וסימנו אותו כעיגול ריק שכונה "סיפר" (Sifr). מילה זו היא שהפכה בסופו של דבר ל"zero" בשפות המערביות. המתמטיקאי הפרסי אל-ח'ואריזמי (Al-Khwarizmi) תרם משמעותית להפצת רעיון האפס בעולם המדע של ימי הביניים.
אל אירופה הגיע האפס רק במאה ה-11 דרך אנדלוסיה, ספרד המוסלמית של אותם ימים. אך הייתה זו דמותו של פיבונאצ'י (Fibonacci), המתמטיקאי האיטלקי בן המאה ה-13, שעזרה להטמיע את האפס והספרות ההודו-ערביות בתרבות המערב.
האפס עיצב את המתמטיקה וחולל בו מהפכה אמיתית, ומעבר להיותו סמל טכני, הוא אפשר את יצירתה של מערכת המספרים העשרונית הפוזיציונלית. במערכת זו, למיקום של כל ספרה יש משמעות קריטית, והאפס מסייע להבדיל בין מספרים שונים. ללא האפס, היה בלתי אפשרי לפתח תחומים מתמטיים מתקדמים כמו אלגברה וחשבון אינפיניטסימלי.
התפתחות האפס כמספר עצמאי, ולא רק כסמל שמייצג חוסר, פתחה דלתות לתפיסות מתמטיות מורכבות. האפס מאפשר לפתור משוואות בסיסיות כמו x + 7 = 7, להבין את מושג הקבוצה הריקה, ולהגדיר גבולות במתמטיקה גבוהה. הוא גם משמש כנקודת מוצא בציר המספרים, המפרידה בין חיוביים לשליליים.
לאפס תכונות מתמטיות ייחודיות שמבדילות אותו מכל מספר אחר: הוא האיבר הניטרלי בפעולת החיבור, כך שכל מספר ועוד אפס שווה לעצמו. כל מספר כפול אפס שווה אפס. לעומת זאת, חלוקה באפס אינה מוגדרת כלל במתמטיקה. אחת התכונות המעניינות היא שכל מספר (שאינו אפס עצמו) בחזקת אפס שווה ל-1.
מעניין שלמרות חשיבותו, רבים מתקשים לתפוס את האפס כמספר "אמיתי" - אולי בגלל שהוא מסמל "שום דבר" בעולם המוחשי. קושי זה מופיע אצל ילדים לומדים אבל גם אצל מבוגרים, ומוביל לעתים לשגיאות בחשיבה מתמטית.
כבר מזמן הפך האפס ליסוד ולבסיס של המתמטיקה המודרנית והתפשט על פני תרבויות. אך בעולם הטכנולוגי של ימינו הפך מה שהתחיל כרעיון מופשט לציר האופן של העולם המודרני.
המחשבים שאנו משתמשים בהם מבוססים על שפה בינארית של אפסים ואחדים בלבד. ללא האפס, לא היה קיים העולם הדיגיטלי, הממוחשב, המקושר והמפותח כל כך וכל מה שמסביבו. כך, הפך מושג שהתחיל כסמל לריק והפך ליסוד שעליו נבנו המדע והטכנולוגיה העכשוויים.
הנה מושג האפס, או מהו האפס? (מתורגם)
https://youtu.be/9Y7gAzTMdMA
התפתחות האפס:
https://youtu.be/vIv1CoHwkTE
תולדות המתמטיקה העתיקה והמצאת האפס בידי ההודי ברהמהגופטה (עברית):
https://youtu.be/vOA4nelKn7s
חשיבות הגילוי של האפס או המצאתו:
https://youtu.be/oNeAhT5FMHs
פריצת הדרך שפתח האפס בעולם המתמטי:
https://youtu.be/D-oxsEknlIc
ותולדות האפס במתמטיקה:
https://youtu.be/z8_Xj-DIpTY

כן, זו לא טעות... היא הייתה המתכנת הראשון של עולם המיחשוב. ולא סתם מתכנת אלא מתכנת שהקדים את זמנו - את התוכנה שכתבה, היא יצרה באמצע המאה ה-19, בערך 100 שנה לפני המצאת המחשב האלקטרוני...
כן, הסיפור מתחיל הרבה לפני שנולד המחשב הראשון. עדה לאבלייס (Ada Lovelace) האנגליה, או אדה לאבלייס, הייתה מתכנתת מחשבים מבלי שראתה מעודה מחשב. למעשה, "קוסמת המספרים" הזו כתבה את תוכנית המחשב הראשונה בהיסטוריה.
איך זה קורה? - ובכן, לאבלייס, או עדה ביירון, הייתה בתו של המשורר האנגלי הרומנטיקן וההולל לורד ביירון. היא הייתה מתמטיקאית צעירה ומבריקה, שהייתה האדם הנכון ובזמן המדויק לסייע לגאון אחר. בכך היא זכתה להיחשב לחלוצה בריטית בעולם המחשבים ולממציאת התכנות של מחשבים.
הכל מתחיל אצלה מלימוד מתמטיקה. את העידוד ללמוד מתמטיקה ומדעים היא קיבלה מאימה. האם גידלה אותה בחברה הגבוהה של לונדון והאמינה שפיתוח הכישורים המתמטיים של ביתה, ימנע ממנה להיות משוררת כמו אביה, איש שעזב את הבית עם לידתה.
ואכן, לאבלייס הוקסמה ממספרים ופיתחה חושים וכישרון מתמטי מדהים, תכונה יוצאת דופן לנשים ועוד פחות נפוץ אצל נערות באותה תקופה. מגיל צעיר למדה עדה בביתה מתמטיקה, עם מורים פרטיים שהזמינה אימה. המורים הללו חיבבו עליה את עולם המתמטיקה והיא ממש שיחקה במספרים.
בהיותה נערה, מורתה הפגישה אותם עם החוקר צ'ארלס באבג' (Babbage), מי שהיה פרופסור למתמטיקה וממציא. האיש פיתח כמה מכונות חישוב ועבודתו בתחום מכונות החישוב נחשבת למשפיעה מאד על התכנון של המחשבים המודרניים.
על המנוע האנליטי, אחת המכונות הללו שתכנן באבג', יצרה לאבלייס המסוקרנת, למרות גילה הצעיר, אלגוריתם שנועד לחשב מספרי ברנולי. האלגוריתם הזה נחשב לאלגוריתם הראשון, שפותח בכוונה לפעול על ידי מכונה. זה היה, כאמור, 100 שנה לפני המצאת המחשב האלקטרוני.
המדהים הוא שעל אף שבאבג’ לא הצליח להשלים את בניית המנוע האנליטי מעולם, עדה הבינה שהמכונה הזו היא סוג של מחשב. וזה עוד לפני שאחרים הבינו מהו מחשב.
בחזונה של לאבלייס, כשהמחשב הזה יפותח, הוא לא רק יחשב חישובים מתמטיים, אלא גם ילחין מוסיקה ויצייר. כבר אז היא כתבה שהמכונה של באבג' דומה לנול האריגה שהמציא ז'וזף מארי ז'קאר (Jacquard). הערכתה הייתה שכמו שהנול של ז'קרד יכול לארוג דוגמאות של עלים ופרחים, יארוג המנוע האנליטי של באבג' דגמים מתמטיים מרהיבים.
כמה שהיא צדקה.
לאבלייס שקדה על תרגום של מסמך שביקש ממנה באבג' לתרגם לאנגלית. בין ההסברים וההערות שהיא תרמה על המכונה של באבג', נוסף שם גם אותו אלגוריתם לחישוב מספרי ברנולי, שזוכה היום להיחשב לתכנית המחשב הראשונה בהיסטוריה.
משום כך רבים רואים בה את מתכנתת המחשבים הראשונה בעולם ולממציאת התכנות. ואגב, את כל זה היא עשתה עד גיל 36, בו הלכה עדה לעולמה ממחלת הסרטן.
בשנת 1979 ובאקט לא שובניסטי של פרגון גברי, קראו בפנטגון האמריקאי על שמה של עדה לאבלייס את שפת התכנות ADA, שפת מחשב המשמשת בעיקר תוכנות ומערכות הפעלה צבאיות.
הנה סיפורה של עדה לאבלייס (עברית):
https://youtu.be/td_5svpezpY?t=3m18s&end=5m32s
תולדות חייה:
https://youtu.be/U5VIiykV0LQ
ועדה לאבלייס הציעה בחייה את מה שנקרא היום מבחן לאבלייס לבינה מלאכותית (מתורגם):
https://youtu.be/Rh9vBczqMk0