أحمد الشمري


استجابة الناس النمطية للابتكارات التي تغير حياتهم

١. لم أسمع به من قبل.
٢. سمعت به، لكني لا أفهمه.
٣. أفهمه، لكن لا أرى فائدته.
٤. أرى كيف يمكن أن يكون ممتعًا للأغنياء، لكن ليس لي.
٥. أستخدمه، لكنه مجرد لعبة.
٦. أصبح أكثر فائدة لي.
٧. أستخدمه طوال الوقت.
٨. لا يمكن أن أتخيل حياتي بدونه.
٩. صدقًا، كيف عاش الناس بدونه؟

Morgan Housel, Time، مترجم بتصرف

Feb 12, 2017

واجب نهاية الأسبوع: رقمنة بطاقات الأعمال

أنوي من فترة استخدام برنامج لإدارة كلمات المرور. برامج إدارة كلمات المرور بشكل عام أكثر أمانًا لأنها تسهّل استخدام كلمات مرور طويلة ومعقدة ومختلفة دون الحاجة لحفظها. قبل أسبوعين كلفت نفسي بواجب لنهاية الأسبوع، اختيار وإعداد ثم استخدام برنامج لإدارة كلمات المرور. سألت في تويتر وبحثت قليلًا واخترت 1Password. أنهيت تثبيته وإعداده على جميع أجهزتي ثم غيرت كلمات المرور لكل الخدمات المهمة قبل نهاية الأسبوع. أستخدم البرنامج من أسبوعين فقط ومع ذلك لاحظت الفرق إيجابيًا. استثمار ساعات قليلة في نهاية الأسبوع آتى أكله سريعًا.

أعجبتي فكرة واجبات نهاية الأسبوع.

نهاية الأسبوع هذه كلفت نفسي بواجب جديد، رقمنة بطاقات أعمال (Business Cards) المعارف والزملاء المتراكمة لتسهيل البحث فيها بدلًا من طريقة البحث الخطي اليدوية التي أستخدمها. جربت عددًا من التطبيقات واختبرتها مع تصاميم وألوان مختلفة من البطاقات. استقريت على CamCard لأنه يحقق التوازن الأفضل بين تصوير البطاقة والتعرف على الحروف، إضافة إلى خدمة التخزين السحابي. سأذهب لأكمل حل الواجب الآن.

Jan 27, 2017

الفجوة

مقدم ومنتج برنامج This American Life آيرا جلاس ربما يكون من أنجح القاصين في وقتنا الحاضر. يستمع ما يقارب مليوني شخص لبرنامج قلاس أسبوعيًا. في مقابلة معه، يتحدث عن رحلته في صناعة القصة ومحاولة صنع شيء ذو قيمة. سمحت لنفسي بترجمة جزء منها بتصرف:

ما لا أحد يخبر به المبتدئين — وأتمنى حقًا لو أن أحدًا أخبرني به:

كلنا من ندخل مجالات إبداعية، ندخلها لأن ذائقتنا جيدة. لكن هناك تلك الفجوة. لأول سنتين تعمل فيها، لا يكون ما تصنعه جيدًا حقًا. هو يحاول أن يكون جيدًا، يملك الإمكانية لأن يكون جيدًا، لكنه ليس كذلك. لكن ذائقتك، الشيء الذي جعلك تبدأ، ذائقتك مازالت رائعة. ذائقتك جيدة بما فيه الكفاية لتعرف أن عملك يخيب أملك.

كثير من الناس لا يتجاوز تلك المرحلة. يتوقفون. أكثر من أعرف ممن ينتجون أعمال إبداعية مثيرة للإهتمام مروا بمرحلة لسنوات كانت فيها ذائقتهم جيدة جدًا وكانوا يعرفون أن عملهم ليس جيدًا بالقدر الذي يريدون — يعرفون أنه كان يفتقد للشيء المميز الذي يريدونه.

الشيء الذي أريد قوله لكل من يمر بذلك هو أن الأمر طبيعي تمامًا.

أهم شيء يمكنك فعله هو أن تنتج الكثير — تنتج كمية مهولة من العمل. حدد لنفسك موعد تسليم كل اسبوع أو كل شهر تنهي فيه قصة. لأنه فقط بإنجاز كمية كبيرة من العمل ستستطيع إغلاق الفجوة. سيكون العمل الذي تنتجه جيدًا كطموحك.

استغرقني إكتشاف هذا الأمر وقتًا أطول مما استغرق أي أحد أعرفه. سيستغرق الأمر بعض الوقت، سيستغرقك الأمر بعض الوقت — من الطبيعي أن يستغرق بعض الوقت. يجب أن تقاوم خلاله.

الجميع يعاني من تلك الفجوة بين الذائقة الجيدة والعمل الجيد في البداية؛ والطريقة الوحيدة لجسر الفجوة هي بمتابعة العمل.

Nov 11, 2015

كيف أحمي فكرتي من السرقة؟

وأخيرًا، الفكرة المميزة التي لم يفكر فيها أحد قبلك. الفكرة التي حين شرحتها لصديقك أخبرك بأنها "أفضل فكرة سمعها". بدأت تحلم بالملايين التي ستحققها. لكن أولًا، يجب أن تحمي فكرتك الثمينة من سارقي الأفكار.

حسنًا، أنا هنا لأخبرك أنه على عكس ما قيل لك، لا أحد يريد سرقة فكرتك! لماذا؟ لأنها في الغالب ليست بالتميّز الذي تظنه. ماهي إحتمالية أن تخطر لشخص آخر نفس فكرتك؟ واحد من مليون؟ اذًا لديك ٣٠ منافس في السعودية لوحدها! ٣٠٠ منافس في أمريكا و أكثر من ١٣٠٠ منافس في الصين! وإذا كنا واقعيين، إحتمالية أن يأتي شخص آخر بنفس فكرتك في الغالب أقرب إلى واحد من ألف. ستقول ماذا عن صديقي الذي أخبرني أن فكرتي هي "أفضل فكرة سمعها"؟ لا تلم صديقك، فهو كان يحاول أن يكون لطيفًا وألا يجرح مشاعرك. كان يأمل أنك ستبحث في الفكرة وتجد أنها ليست بالتميز الذي تظنه.

والملايين؟ ربما تعرف هذا مسبقًا، لكن الناس لا تشتري الأفكار. عليك أن تعمل على تحويل الفكرة إلى منتج أو خدمة يريدها الناس ليصبح لها أي قيمة. هذا يعني أن عليك أن تبحث وتعمل! تتحقق من فاعلية الفكرة، تدرس السوق، تعد خطة المشروع، تدرس جدوى المشروع، تشكل فريق، وتعمل بجد إلى أن يرى منتجك النور، وتبدأ في التسويق والمبيعات والدعم!

ولا تتعب نفسك بالبحث عن استثمار في مرحلة الفكرة. لا أحد يريد الاستثمار في "كلام"؛ يجب أن يكون لديك شيء لعرضه على المستثمرين٬ مايجب أن تبحث عنه هي الاستشارة التي ستساعدك على التنفيذ.

تحويل فكرة إلى منتج يتطلب وقت وكثير من الجهد وأحيانًا بعض المال. من "سيسرق" فكرتك عليه بذل كل هذا، لذلك في الغالب لن يسرق فكرتك. الفكرة هي الجزء الأسهل، والذي لا قيمة له بمفرده. القيمة في التنفيذ. إن كنت حقَا تؤمن بفكرتك ابدأ بتنفيذها بدلًا من محاولة حمايتها من خوف غير مبرر.

هدفي هنا ليس تحطيم أحلامك أو تثبيط عزيمتك، بل العكس! هدفي هو دفعك لتبدأ بفعل ما هو مهم؛ ويسعدني أن أساعدك على ذلك بكل ما أستطيع.

Jun 20, 2015

Swift: Optionals

من المبادئ المهمة في Swift هو جعل اللغة آمنة، هذا يعني محاولة تجنب الأخطاء قدر الإمكان، وكذلك محاولة إيجاد الأخطاء في Compile Time وليس Run Time. أي عندما تقوم ببناء التطبيق وليس أثناء استخدامه.

الأنواع الاختيارية (Optionals) تختلف بأن الهدف منها هو التعبير عن امكانية وجود قيمة أو امكانية عدم وجود قيمة. يمكن التعبير عن حالة الأنواع الإختيارية بطريقتين "هناك قيمة، والقيمة هي x" أو "لا يوجد قيمة على الإطلاق".

كمثال، احدى خصائص النوع String هي دالة toInt، هذه الدالة تحاول تحويل النص إلى Int. لكن بالطبع ليس كل نص يمكن تحويله لعدد. النص "123" يمكن تحويله إلى القيمة العددية 123. لكن نص مثل "hello, world" لا يمكن تحويله.

let possibleNumber = "123"
let convertedNumber = possibleNumber.toInt()

في المثال أعلاه، الثابت convertedNumber ليس من نوع Int كما قد تظن، هو في الواقع من نوع Int? ويعني Optional Int. نرمز للأنواع الاختيارية (Optionals) باضافة علامة استفهام ? إلى اسم النوع.

لماذا Optionals؟

من خصائص Swift أنها Type-Safe Language فهي لن تسمح لك يتعيين قيمة تختلف عن النوع المُعرّف، سواء لمتغير أو ثابت أو عنصر لدالة أو ناتج لدالة.

في مثال الدالة toInt، في بعض الأحيان لن تتمكن من تحويل النص إلى قيمة عددية، ماذا ستكون النتيجة المُعادة من الدالة في تلك الحالة؟ قد نقترح 0 ولكن صفر نتيجة صحيحة للنص "0"، كذلك هو الحال للعدد -1 أو أي عدد في الواقع. ولأن النوع Int فلا يمكننا استخدام غير الأعداد الصحيحة. هنا تتضح فائدة Optionals، بامكان استخدام القيمة الخاصة nil مع Optionals للعتبير عن عدم وجود قيمة.

Forced Unwrapping

بامكانك تخيل أن Optionals تكوّن طبقة تغلف المتغير أو الثابت لتُعلمك قبل استخدامه بوجود قيمة من عدمها. استخدم if مع المتغير أو الثابت من نوع Optional لتفحص وجود القيمة. اذا كان له قيمة ستكون النتيجة true، وان لم يكن له قيمة ستكون النتيجة false.

في حال تأكدت من وجود قيمة، استخدم علامة التعجب ! في نهاية اسم المتغير أو الثابت لكشف القيمة. استخدام علامة التعجب هو كقولك: "أعرف أن لهذا المتغير قيمة، فضلا استخدمها". هذا يسمى Forced Unwrapping.

let possibleNumber = "123"
let convertedNumber = possibleNumber.toInt()

if convertedNumber {
    println("\(possibleNumber) has an integer value of \(convertedNumber!)")
} else {
    println("\(possibleNumber) could not be converted to an integer")
}
// prints "123 has an integer value of 123"

Optional Binding

تستخدم Optionals كثيرًا في Swift، لذلك هناك طريقة أسهل لاستخراج قيمها وهي Optional Binding. تستخدم هذه الطريقة لفحص اذا كان Optional يحمل قيمة، وفي حال كان يحمل قيمة، تعين القيمة لثابت أو متغير مؤقت. كلها في تعبير واحد. يمكنك استخدام Optional Binding مع if و while.

تكتب Optional Binding مع if كالتالي:

 if let <constantName> = <someOptional> {
    <statements>
}

يمكننا كتابة مثال possibleNumber السابق باستخدام Optional Binding بدلًا من Forced Unwrapping كالتالي:

if let actualNumber = possibleNumber.toInt() {
    println("\(possibleNumber) has an integer value of \(actualNumber)")
} else {
    println("\(possibleNumber) could not be converted to an integer")
}
// prints "123 has an integer value of 123"

بامكانك قراءتها: "اذا كان Optional Int المعاد من possibleNumber.toInt يحتوي على قيمة، عرف ثابت جديد اسمه actualNumber واجعل قيمته هي القيمة الموجودة في Optional".

اذا نجح التحويل، الثابت actualNumber يصبح متوفرًا في الفرع الأول للعبارة الشرطية if. يكون معرفًا ويحمل القيمة الموجودة في Optional، ولا داعي لاستخدام علامة التعجب ! لاستخراج قيمته. كما في المثال، نستخدم actualNumber مباشرة لطباعة القيمة المحوّلة.

يمكنك استخدام متغير عوضًا عن ثابت اذا احتجت للتحكم بقيمة actualNumber. ببساطة اكتب if var actualNumber.

nil

تعين حالة عدم وجود قيمة لمتغير من نوع Optional باستخدام القيمة الخاصة nil

var serverResponseCode: Int? = 404
// serverResponseCode يتحتوي على قيمة 404
serverResponseCode = nil
// serverResponseCode لا يحتوي على قيمة

لا يمكن استخدام nil مع غير Optionals. اذا كنت بحاجة للتعبير عن عدم وجود قيمة لمتغير أو ثابت في حالات معينة، عرفه دئمًا على أنه نوع اختياري (Optional).

هذه التدوينة هي جزء من سلسلة تدوينات عن لغة البرمجة Swift

Jun 24, 2014