יום שישי, 8 באוגוסט 2008

הלקוח, מה הוא רוצה?

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

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

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

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

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

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

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

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

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

המשך גלישה מהנה.

יום שני, 4 באוגוסט 2008

קידוד בעזרת DIV, אבל לא רק

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

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

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

שלב 2 - יצירת תבנית בסיסית
בשלב הזה מכינים את הדברים הבסיסיים בקידוד:
תבנית ה-HTML הכללית, בה אנו הולכים להשתמש, תיהיה הצעד הראשון, כאשר אם יש תקן בו אנו רוצים להשתמש, כבר עתה אנו נכניס אותו כחלק ממבנה ה-HTML ולא בסוף (כמו שלעיתים אני רואה שאנשים נזכרים, ואז קצת מאוחר מידי).
בקוד אנו נכניס תג meta המספק מידע על סוג התווים (לדוגמא: UTF8) ודף CSS חיצוני שיכיל את קוד ה-CSS (יחסוך בהמשך קפיצה בין מיקומים בדף, ובנוסף יעזור להגדיל את כמות התוכן בדף ביחס לקוד).

בקובץ ה-CSS אנו נכתוב כבר עתה ערכים לתגית body שנרצה שיהיו בסיס בדף, אם זה צבע הרקע מאחורה (או שאולי תמונה?!), אם זה הורדת המסגרת הפנימית (padding) של הדף, אם זה קביעות הקשורות לטקסט כמו גודל פונט, וכל קביעה כללית אותה אנו נרצה.

דוגמה לדפים משלב 2:
HTML Document (index.html):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml11-flat.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<title>game</title>
<link rel="stylesheet" href="./global.css" type="text/css" />
</head>

<body>
<!-- Text -->
</body>
</html>
CSS Document (global.css):

body
{
direction: ltr;
padding: 0px;
margin: 0px;
font-size: 14px;
font-family: arial,verdana,sans-serif;
}

שלב 3 - אלמנט גלובאלי
הערה לפני: מעתה קוד ה-HTML עליו אני אכתוב בא במקום ההערה במסמך ה-html שהצגתי קודם.

לאחר שיש בידינו את מה שאנו רוצים לעשות (שלב 1) ואת הקוד הכללי של הדף (שלב 2), אנו יוצרים אלמנט גלובאלי, שבתוכו יכנסו כל שאר האלמנטים (אלא אם במקרה חריג נחליט ליצור אלמנט מתחתיו שיכיל מידע אחר שאנו רוצים כביכול מחוץ לעיצוב).
האלמנט הזה יהיה div, כיוון ש-div הוא אלמנט מסוג block, ואין לו שום מאפיין עיצובי אחר.
HTML Document (index.html):

<div id="global">

</div>
כעת לאחר שיצרנו אלמנט גלובאלי, אנו נגדיר לו כיצד יראה, ותכונות הקשורות אליו.
CSS Document (global.css):

#global
{
width: 800px;
border: 1px solid gray;
margin: 10px auto 5px;
}
שימו לב: כבר עכשיו רצוי לבדוק בולידטור אם הינכם עומדים בתקנים, לפחות של CSS, כדי למנוע בעיות עתידיות בהמשך.

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

יש תמיד שאלה בנוגע לכמה רוחב לאלמנטים האלו, וכתשובה חד משמעית הייתי אומר לכם להכריע באחוזים, מהסיבה הפשוטה שלאחר מכן תוכלו לשנות את האלמנט המכיל אותם, והם יושפעו בלי לעשות לכם הרבה בעיות.
HTML Document (index.html):

<div id="global">
<div id="top">

</div>
<div id="left">

</div>
<div id="right">

</div>
<div id="bottom">

</div>
</div>
כעת בעזרת CSS אנו דואגים שכל דבר יהיה במקומו, ניתן לעשות זאת בעזרת float, בעזרת margin, בעזרת padding, שימוש ב-clear, או בכל אלמנט אחר שיכול לעזור בקביעת המבנה.
ניתן ואף רצוי לתת רקע שונה לכל אחד מהאלמנטים, כדי שנוכל לזהותם.
מה שאני לא ממליץ לעשותו הוא קביעה של גובה לאלמנטים, כי אנו רוצים אותם גמישים בלי הגבלה לגובה מסויים (ברוב המקרים).
CSS Document (global.css):

#top, #bottom
{
padding: 0.5em;
background-color: gray;
color: white;
clear: left;
}

#left
{
float: left;
width: 30%;
margin: 0;
padding: 1em;
}

#right
{
border-left: 1px solid gray;
margin-left: 32%;
padding: 1em;
}
לאחר שראיתם כי הגדלים מתאימים וכי האלמנטים מסתדרים כפי שרציתם (אפשר להוסיף תוכן זמני כדי להיות בטוחים שיציגם), מומלץ לעצבם (ניתן לראות בדוגמא עיצוב פשוט).
בידקו שוב את ה-CSS בולידטור כדי לוודא שהינו עומד בתקנים.

שלב 5 - תוכן ואלמנטים נוספים
כעת לאחר שיש בידינו מבנה, אנו לא נשתמש ב-div אלא אם נצטרך את התכונות שלו (אלמנט מסוג block ללא תכונות עיצוביות נוספות), אלא באלמנטים לפי הצורך:
  1. נשתמש בתגי ה-H עבור כותרות.
  2. נשתמש ברשימה (UL) עבור תפריטי קישורים.
  3. בתגית P עבור פסקאות.
  4. בכל אלמנט אחר בעת הצורך.
כאשר יש בידינו את המסמך הכללי, אנו ניצור תגית H1 לכותרת העליונה, ורשימה ב-DIV השמאלי עבור לינקים (הכוללת בתוכה כבר לינקים לצורך העניין), אשר מעליה נוסיף תגית H2 לכותרת של הרשימה.
ניתן כבר להוסיף תוכן בשביל שנידע סדר גודל של דברים, ובכדי שנוכל לעצב הכל בהתאם.
HTML Document (index.html):

<div id="global">
<div id="top">
<h1>iBlog</h1>
</div>
<div id="left">
<h2>Links</h2>
<ul>
<li><a href="#">Link 1</a></li>
<li><a href="#">Link 2</a></li>
<li><a href="#">Link 3</a></li>
<li><a href="#">Link 4</a></li>
<li><a href="#">Link 5</a></li>
</ul>
</div>
<div id="right">
<p>
text text text text text text text text text text text<br />
text text text text text text text text text text text<br />
text text text text text text text text text text text<br />
text text text text text text text text text text text
</p>
<p>
text text text text text text text text text text text<br />
text text text text text text text text text text text
</p>
</div>
<div id="bottom">
(c) Copyright
</div>
</div>
כעת נבטל כמה תכונות עיצוביות של מספר אלמנטים כדי שנוכל להמשיך לעבוד.
CSS Document (global.css):

h1, h2, #left ul
{
padding: 0;
margin: 0;
list-style: none;
}
אלמנטים נפוצים שהייתי ממליץ להשתמש בהגדרות עיצוב אלו כדי לבטל את שלהן:
ul, dl, dt, dd, form, h1, h2, h3, h4, h5, h6, h7, p


לאחר שביטלנו את התכונות העיצוביות שמפריעות לנו, נוכל לעבוד על האלמנטים.
לתגיות h1 אנו נגדיר מרכוז, את הקישורים שבתוך הרשימה שב-DIV השמאלי, אנו נגדיר כאלמנטי block בשביל שנוכל לעצבם.
ואז נוכל לשנותם כעולה על רוחנו.
CSS Document (global.css):

h1
{
text-align: center;
}

#left ul a
{
display: block;
width: 90%;
background-color: gray;
color: white;
margin-bottom: 2px;
text-align: center;
text-decoration:none;
}
בנוסף, נוכל להגדיר לקישורים אלו מצב שיפעל בעת שעוברים מעליהם, נניח לשנות את צבע הרקע לשחור.
CSS Document (global.css):

#left ul a:hover
{
background-color: black;
color: white;
}
שימו לב: חובה לבדוק אם ה-HTML וה-CSS תקינים בעזרת ולידטור.

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

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

קודים מלאים
HTML Document (index.html):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml11-flat.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<title>game</title>
<link rel="stylesheet" href="./global.css" type="text/css" />
</head>

<body>
<div id="global">
<div id="top">
<h1>iBlog</h1>
</div>
<div id="left">
<h2>Links</h2>
<ul>
<li><a href="#">Link 1</a></li>
<li><a href="#">Link 2</a></li>
<li><a href="#">Link 3</a></li>
<li><a href="#">Link 4</a></li>
<li><a href="#">Link 5</a></li>
</ul>
</div>
<div id="right">
<p>
text text text text text text text text text text text<br />
text text text text text text text text text text text<br />
text text text text text text text text text text text<br />
text text text text text text text text text text text
</p>
<p>
text text text text text text text text text text text<br />
text text text text text text text text text text text
</p>
</div>
<div id="bottom">
(c) Copyright
</div>
</div>
</body>
</html>
CSS Document (global.css):

body
{
direction:ltr;
padding: 0px;
margin: 0px;
font-size:14px;
font-family: arial,verdana,sans-serif;
}

#global
{
width: 800px;
border: 1px solid gray;
margin: 10px auto 5px;
}

#top, #bottom
{
padding: 0.5em;
background-color: gray;
color: white;
clear: left;
}

#left
{
float: left;
width: 20%;
margin: 0;
padding: 1em;
}

#right
{
border-left: 1px solid gray;
margin-left: 22%;
padding: 1em;
}

h1, h2, #left ul
{
padding: 0;
margin: 0;
list-style: none;
}

h1
{
text-align: center;
}

#left ul a
{
display: block;
width: 90%;
background-color: gray;
color: white;
margin-bottom: 2px;
text-align: center;
text-decoration:none;
}

#left ul a:hover
{
background-color: black;
color: white;
}

בהצלחה, והמשך גלישה מהנה.

יום שישי, 1 באוגוסט 2008

ביום בו המחשב יכיר אותכם

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

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

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

חושבים שזה מדהים? בואו נקפוץ ליום שאחרי.

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

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

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

המשך גלישה נעימה ואנונימית.