דברים שמעצבנים אותי ב PHP ו MySQL

הקדמה

זה לא סוד שאני לא סובל את PHP. בראש ובראשונה זו לא שפה, אלא אוסף פאטצ'ים ליצור templates עבור עולם הweb. ההתחלה של "תכנות" עם PHP מאוד פשוטה, אבל ליצור משהו שעובד טוב, יעיל ובטוח, ובכן זה כבר סיפור אחר.

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

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

PHP

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

אחת הבעיות שלי עם פרל (מאז ומתמיד), ומשום מה היה מישהו שחשב שזה יהיה "מאגניב" לאמץ ל PHP הוא ש 0 = ריק. זה אומר שגם המחרוזת שלך מכילה רק את הערך "0", הוא בהכרך יחזיר לך שהוא ריק. ד"א גם אם המשתנה הוא false (כלומר ערך בוליאני, לא הבדיקה האם המשתנה מוגדר ו/או מכיל ערך כלשהו), עדיין הפונקציה empty תגיד כי הערך ריק משום מה.

עכשיו נגיד ועשיתי שגיאה בקוד שלי, ובמקום לכתוב את המשתנה $home כתבתי $hme ולא שמתי לב לזה. רק ובמידה וPHP מוגדר לדווח שגיאות ללוג, אגלה שעשיתי שגיאה (בלוג), בעוד ששפות תכנות (דינאמיות או לא), ידווחו כי הן מעולם לא הכירו לפני כן את המשתנה (אלא אם אני מציב לתוכו משהו).

התכנות בPHP אינו מבני בדיוק (אינני יודע אם זו המילה הנכונה). הבעיה היא אינה בכך שפשוט אפשר לכתוב, אלא בכך שיש חוסר סדר בין התוספים השונים.
נגיד ואני צריך ניתוח מחרוזות, אז יש לי קבוצות שונות לזה. כלומר האם אני רוצה ניתוח בסגנון של כלי POSIX (למשל), אני אוכל להעזר בהם אבל אז ה state of mind בגישה הוא קרוב מאוד ל C ואין משהו שהוא באמת "ברוח" של PHP. כל כלי מגיע בהלך חשיבה לגמרי שונה, ודורש ממך חשיבה לגמרי שונה. למעשה למעט הצורך בלממש את זה בצורה שהמשתנים, והטיפוסים השונים של PHP עובדים, אין שום דבר שזהה בכל ספרייה, גם אם הן נועדו לענות על אותם הצרכים.

MySQL

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

בעיה ראשונה היא בכך שהוא לעולם לא ירים לך חריגה כאשר התוכן שלך לא בגודל/אורך המתאים, אלא יחתוך דברים לחלק הקרוב ביותר שהוא יכול ויכניס את התוכן פנימה.
מרבית מסדי הנתונים (הרלציונים כרגע לצורך הטיעון), כאשר אתה מגדיר להם גודל קבוע של שדה, יצעקו עלייך במידה ואתה חורג מהגודל, וירימו קול צעקה בצורת חריגה (או דיווח שגיאה בצורה אחרת), ולא יסיכמו לקבל את הדברים.
אבל לא כך ב MySQL ועכשיו לך תתמודד שאתה מוצא ערך 127 כמספר, כאשר הערך המקורי היה 250. לך תשחזר את הנתון הזה.
זה דורש ממך עוד תוספת תכנות אשר תבדוק טווחים ובדיקות ערכים גם מעבר לנדרש ממסדי נתונים רגילים.

בעיה שנייה היא העדר Sequence. כאשר אני מדבר על Sequence, אני מדבר על שדה כלשהו אשר יודע לשמור בצורה אטומית ללא קשר לsession פתוח, או כמות חיבורים את הערך האחרון בצורה מספרית.
כך למשל, יותר מ session בודד מסוגל להכיל את הספרה "10", ורק אולי בזמן כתיבה MySQL ידע להתמודד עם זה. מה שהופך את MySQL לפחות ACID ממה שנדמה שהוא.

ואם כבר ב ACID עסקינן, מדוע טרנזאקציה כלשהי במידה ויש עליה commit שמצליח, אינו מצליח להתעדכן מיידית, אלא לפעמים לוקחים מספר שניות עד שתראה את השינויים בשאר החיבורים שלך ? כיצד בדיוק אתה יכול להבטיח ככה שהערכים שלך באמת התעדכנו בצורה נכונה ומשפיעים על כולם ?

ואם אמשיך בקו של 2 הטענות הקודמות, אז מדוע כאשר כבר כן משהו נכשל בעת insert למסד נתונים, שדה auto increment עדיין התעדכן לו אצלי ב session ?
כלומר אם עכשיו יש לי למשל שדה שהוא unique key, והזנתי עוד ערך זהה לתוכו שכבר קיים, ההזנה תיכשל (בצדק), אבל בהזנה הבאה תגלה כי אם הauto increment עמד על "1", עכשיו הוא עומד על "3".
אם היה sequence אטומי, זה לא היה קורה, כי הוא היה מתעדכן רק בהצלחה, לא בכישלון, והיה משפיע על כל החיבורים.
יותר מזה אבל, יש מצבים בהם 2 חיבורים (session) שונים, יבצעו insert וכל אחד מהם יחזיק ב auto increment אחר בגלל הכישלון, כלומר מישהו אחר גם יכול להחזיק את הספרה "3", ומה נעשה עכשיו עם חפיפה ? אולי מישהו יכשל, ואולי לא.

סיכום קצר

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

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

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

רשומה זו פורסמה בקטגוריה MySQL, PHP, טכנולוגיה, מסדי נתונים, פיתוח, קוד פתוח, תוכנה, תכנות, תלונות. אפשר להגיע ישירות לרשומה זו עם קישור ישיר.

3 תגובות על דברים שמעצבנים אותי ב PHP ו MySQL

  1. tddpirate הגיב:

    מה כבר אפשר לצפות משפת התכנות של הווגונים?

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s