uk
Feedback
ToCode

ToCode

Відкрити в Telegram

טיפים קצרים למתכנתים מאת ינון פרק

Показати більше
1 420
Підписники
Немає даних24 години
+27 днів
-230 день
Архів дописів
ToCode
1 420
📌 איך "לסחוט" מודל שפה התוצאה הראשונה בגוגל היא לא תמיד התוצאה שמתאימה למה שחיפשתם. באותו אופן התשובה הראשונה של מודל שפה לא תמיד מתאימה לבעייה שלכם. זאת לא בעיה במודל השפה כמו שזאת לא היתה בעיה בגוגל. אנחנו פשוט לא תמיד יודעים איך לנסח את הבעיה מספיק טוב בפעם הראשונה ולומדים תוך כדי תנועה. בימים של חיפוש בגוגל הייתי ממליץ לכם להכנס ל 4-5 תוצאות ראשונות לפחות, ואם הנושא חשוב אפילו לעשר התוצאות הראשונות כדי לגבש דעה. היום עם AI אנחנו רוצים לבצע תרגיל דומה. המשחק הוא שבמקום כפתורים לתוצאות הבאות עלינו להשתמש בפרומפטים. דבר ראשון שאני מנסה כשאני רוצה לקבל יותר אפשרויות ממודל שפה הוא פשוט לבקש. פרומפט כמו "הצג את כל הגישות לכתוב קוד פייתון שסופר כמה מספרים ראשוניים יש בין 1 למיליון והשווה בין הביצועים שלהן" גורם למודל שפה להדפיס 10-12 גישות שונות ונותן לכם אפשרות טובה יותר להחליט מה הדרך שמתאימה לכם. אם מתלבטים בין מספר אפשרויות נרצה לבקש מהמודל לנתח כל אפשרות בנפרד ולראות את כל ההשלכות שלה. שיטה נוספת שאני אוהב נקראת ״מה אם״. בשיטה זו אנחנו מציגים שאלה ואז מתחילים לשנות את ה Constraints כדי לראות מגוון של תשובות. בדוגמה של מספרים ראשוניים אני יכול לנסות שיחה כזאת: שאלה ראשונה-
create a python program that counts how many prime numbers are there between 1 and 1000000
שאלה שניה-
what if memory is a constraints?
שאלה שלישית-
what if we were counting until 100000000000 ?
כל שאלה נוספת יכולה לקחת את השיחה למקום חדש. לפעמים התשובות הקודמות יפריעו למודל להיות יצירתי ואז מתחילים שיחה חדשה ומנסים לדחוף אותה לשאלה שמעניינת אותנו. פרומפט כזה גם יכול לעודד את היצירתיות של ה AI:
Expand the dillema and better explain each side. Provide examples to possible problems or advantages of each approach. You don't have to recommend an approach let's just contemplate the conflict
אם יצאתם מהשיחה עם חומר למחשבה, מספר אפשרויות והבנה באיזה מצבים עדיף להשתמש בכל אפשרות אתם בכיוון הנכון ללמוד משהו חדש היום.

ToCode
1 420
        "- A 'Top Stories' section: the 5-8 most significant stories across all "
        "sources, each with a one-sentence summary based on its title, a link, "
        "and its source.\n"
        "- A short 'Also Worth a Look' bullet list of 5-10 more headlines with "
        "links.\n"
        "Merge duplicate stories that appear on multiple sources and mention "
        "each source's engagement (points/score/comments) where notable."
    ),
    model=OpenAIChatCompletionsModel(model=MODEL_NAME, openai_client=gemini_client),
    tools=[fetch_hacker_news, fetch_reddit_programming, fetch_lobsters, fetch_devto],
)


async def main() -> None:
    today = datetime.date.today().strftime("%B %d, %Y")
    result = await Runner.run(
        news_agent, f"Generate the tech news digest for today, {today}."
    )
    print(result.final_output)


if __name__ == "__main__":
    asyncio.run(main())
כמה דברים ששמתי לב מקריאת הקוד שלא הספקתי להציג בוובינר: 1. משיכת המידע מאתרי חדשות היא באמצעות פניה לכל API של אתר חדשות, ושונה לכל אתר. לכל אתר חדשות פונקציה משלו. אופציה אחרת שלדעתי היתה עובדת טוב יותר היא להגדיר רשימה של אתרי חדשות, למשוך את ה HTML-ים שלהם ולהשתמש בספריה כמו Readability כדי להגיע לתוכן של כל אתר, ואת זה פשוט לתת ל LLM. אני מבין למה קלוד השתמש ב APIs של כל אתר אבל נראה לי שזה יותר קשה לתחזוקה ושינוי. במיוחד אם רוצים לדמיין עולם בו משתמשים שונים יקבלו סקירה של אתרים שונים שמעניינים אותם. 2. הסיכום עצמו הוא פשוט התשובה של המודל. זה שוב נוח אבל לא תמיד עקבי. יותר הגיוני במערכת כזו להגדיר לסוכן להחזיר מידע גולמי ולהכניס אותו לתוך תבנית שהכנתם מראש. 3. הסוכן שכתבנו פשוט מדפיס את התשובה למסך. יותר הגיוני לשלוח את התשובה הזאת למייל שמוגדר מראש במערכת או למייל שהתקבל יחד עם הבקשה כפרמטר. 4. הסוכן לא יכול לקרוא את המאמרים עצמם ולכן יכול להתבסס רק על הכותרות, מספר התגובות והתיוגים של כל מאמר. סוכן יותר מתוחכם היה משתמש בכלי למשיכת מאמרים כדי לקרוא את המאמרים לפני שממליץ עליהם. סך הכל מדובר בסוכן פשוט שעובד בדיוק לפי הפרומפט שהוגדר. היכולת היחידה של OpenAI Agents SDK המעורבת כאן היא Tool Call, כלומר היכולת של המודל "לקרוא" חזרה לקוד פייתון כדי למשוך מאמרי חדשות מהאתרים. המימוש באמצעות סוכן קידוד מזכיר לנו את הכח של סוכני קידוד ואת התפקיד שלנו כמפתחים בעולם העתידי של קידוד עם סוכנים. הסוכן יודע לקחת רעיון ולהפוך אותו לקוד. המשימה שלנו היא לעלות ברמת האבסטרקציה ולהבין איך אנחנו רוצים שהמערכת תעבוד.

ToCode
1 420
OpenAI-compatible chat completions endpoint.
"""

import asyncio
import datetime
import os

import httpx
from agents import (
    Agent,
    OpenAIChatCompletionsModel,
    Runner,
    function_tool,
    set_tracing_disabled,
)
from dotenv import load_dotenv
from openai import AsyncOpenAI

load_dotenv()

GEMINI_BASE_URL = "https://generativelanguage.googleapis.com/v1beta/openai/"
MODEL_NAME = "gemini-2.5-flash"

gemini_client = AsyncOpenAI(
    base_url=GEMINI_BASE_URL,
    api_key=os.environ["GEMINI_API_KEY"],
)

# Tracing exports to the OpenAI platform, which we have no key for.
set_tracing_disabled(True)

HTTP_HEADERS = {"User-Agent": "news-digest-agent/0.1 (daily tech digest demo)"}


async def _get_json(url: str, params: dict | None = None):
    async with httpx.AsyncClient(
        headers=HTTP_HEADERS, timeout=30, follow_redirects=True
    ) as client:
        response = await client.get(url, params=params)
        response.raise_for_status()
        return response.json()


@function_tool
async def fetch_hacker_news(limit: int = 15) -> list[dict]:
    """Fetch the current Hacker News front page stories.

    Args:
        limit: Maximum number of stories to return.
    """
    data = await _get_json(
        "https://hn.algolia.com/api/v1/search",
        params={"tags": "front_page", "hitsPerPage": limit},
    )
    return [
        {
            "title": hit["title"],
            "url": hit.get("url"),
            "points": hit.get("points"),
            "comments": hit.get("num_comments"),
            "discussion": f"https://news.ycombinator.com/item?id={hit['objectID']}",
        }
        for hit in data["hits"]
    ]


@function_tool
async def fetch_reddit_programming(limit: int = 15) -> list[dict]:
    """Fetch the hottest posts from reddit.com/r/programming.

    Args:
        limit: Maximum number of posts to return.
    """
    data = await _get_json(
        "https://www.reddit.com/r/programming/hot.json", params={"limit": limit}
    )
    return [
        {
            "title": post["data"]["title"],
            "url": post["data"]["url"],
            "score": post["data"]["score"],
            "comments": post["data"]["num_comments"],
            "discussion": f"https://www.reddit.com{post['data']['permalink']}",
        }
        for post in data["data"]["children"]
        if not post["data"].get("stickied")
    ]


@function_tool
async def fetch_lobsters(limit: int = 15) -> list[dict]:
    """Fetch the hottest stories from lobste.rs.

    Args:
        limit: Maximum number of stories to return.
    """
    data = await _get_json("https://lobste.rs/hottest.json")
    return [
        {
            "title": story["title"],
            "url": story["url"] or story["comments_url"],
            "score": story["score"],
            "comments": story["comment_count"],
            "tags": story["tags"],
            "discussion": story["comments_url"],
        }
        for story in data[:limit]
    ]


@function_tool
async def fetch_devto(limit: int = 15) -> list[dict]:
    """Fetch today's top articles from dev.to.

    Args:
        limit: Maximum number of articles to return.
    """
    data = await _get_json(
        "https://dev.to/api/articles", params={"top": 1, "per_page": limit}
    )
    return [
        {
            "title": article["title"],
            "url": article["url"],
            "reactions": article["positive_reactions_count"],
            "comments": article["comments_count"],
            "tags": article.get("tag_list", []),
        }
        for article in data
    ]


news_agent = Agent(
    name="News Searcher",
    instructions=(
        "You are a tech news editor producing a daily digest.\n"
        "Use ALL of your tools to gather today's top stories from Hacker News, "
        "r/programming, Lobsters, and Dev.to.\n"
        "Then write a digest in markdown with:\n"
        "- A title with today's date and a 2-3 sentence overview of the day's "
        "main themes.\n"

ToCode
1 420
📌 סיכום וובינר סוכנים חכמים אתמול עשינו וובינר על סוכנים חכמים שהלך לדעתי הרבה יותר טוב מזה של שבוע שעבר. אם הייתם אני מקווה שגם לכם היה מעניין. המעבר לטימס כלל קצת קשיי הסתגלות ודי פספסתי את הצ'אט אבל אולי זה עודד אנשים להשתתף. בכל מקרה אני רוצה לסכם כאן את עיקרי הדברים ולצרף את דוגמת הקוד שכתבנו. ✏ מה זה בכלל סוכן התחלנו את המפגש בשאלה הכי חשובה: מה זה בכלל סוכן. עבור השיחה שלנו הסכמנו שסוכן הוא תוכנת מחשב שכוללת גם קריאה למודל שפה. זאת לא הגדרה מושלמת ולא היחידה בתעשייה אבל היא עוזרת לנו להתקדם. התובנה המשמעותית כאן היתה שסוכן לא חייב להיות תוכנה בממשק של Chat. גם תוכנה שמתייקת אימיילים יכולה להיקרא סוכן, גם משחק אסטרטגיה ששחקן המחשב הוא בעצם מודל שפה הוא סוכן, גם מערכת שמשאירה Code Reviews על קוד היא סוכן. ואם סוכן זה כל מה שיש לו ממשק עם LLM אז פריימוורק לפיתוח סוכנים זו ספריה שמנסה לענות על אתגרים נפוצים ומשותפים בפיתוח תוכנות מסוג זה. ✏ קוד או GUI, ואיזו פריימוורק מאחר וסוכן הוא כל תוכנה שיש לה חיבור ל LLM ומאחר ואנחנו כל כך אוהבים לדבר עם מודלי שפה סיכוי טוב שחלק גדול מהתוכנות החדשות או מהרכיבים החדשים שייכנסו לתוכנות יהיו סוכנים. יש כלים גרפיים רבים לפיתוח סוכנים בממשקי Drag & Drop. בין המפורסמים n8n ו opal. אם כלים כאלה פותרים לכם את הבעיה שווה להשתמש בהם. אם אתם כמוני מעדיפים לראות קוד, או אם אתם צריכים לשלב סוכן במערכת קיימת, או אם אתם רוצים יותר שליטה על התוצאה כנראה שתרצו לבחור באפשרות של פיתוח קוד. אפילו אחרי שבחרתם לכתוב את הסוכן שלכם בקוד יש שתי החלטות חשובות לקבל: 1. באיזה שפה ופריימוורק להשתמש? 2. איפה להריץ את הקוד? שתי השאלות קשורות. אם בחרתי להריץ את הסוכן על AWS אז יש סט שפות ופריימוורקים שנתמכים. על Azure יש תמיכה בשפות אחרות. על Vercel שוב אחרות. אני תמיד יכול להריץ את הסוכן על שרת שלי ואז יש לי את הגמישות המירבית בבחירת השפות אבל אולי לא אקבל את השירותים שאני רוצה מהפלטפורמות ואצטרך לכתוב ולתחזק יותר קוד בצד שלי. סביבות ההרצה עצמן והפריימוורקים נמצאים היום בתחרות על פיצ'רים ועל נתח שוק וכך אנחנו רואים את אותה בעיה מקבלת מענה בכמה שכבות. לדוגמה כולם יודעים שבשיחה עם סוכן חכם הרבה פעמים אנחנו רוצים לצרף להודעה גם את ההודעות הישנות ואת התשובות שלהן (כדי לתת הרגשה של שיחה רציפה). ספריית קוד כמו OpenAI Agents SDK כוללת מנגנון מובנה לניהול Sessions. אבל גם ה API של OpenAI בצד השרת יודע לשמור Sessions וגם סביבת הריצה Agent Core של AWS יודעת לנהל Session. כפילות זו תלווה אותנו בתקופה הקרובה עד שכלי הפיתוח ושיטות העבודה יתייצבו. ✏ ארכיטקטורה בגדול סוכן חכם שעובד מורכב ממספר שכבות: 1. שכבה ראשונה היא הטריגר - משהו צריך להפעיל תהליך. זה יכול להיות בקשת HTTP, שעה מסוימת (משימה מתוזמנת), אימייל נכנס, הודעה בטלגרם. הטריגר עובר למערכת שלנו מתוך סביבת הריצה ומוגדר בסביבת הריצה של הסוכן. אם הפעלתי את הסוכן שלי על AWS אז AWS יגדירו איזה טריגרים הם מכירים. אם אני מעלה את הסוכן ל Vercel אז הטריגר יגיע משם. 2. הטריגר מגיע לטיפול הקוד שלנו שרץ בתוך הפלטפורמה. אם אנחנו רצים על AWS אז רכיב של AWS שנקרא Agent Core מריץ את הקוד. אם זה על Vercel אז הסוכן רץ בתור Vercel Function. בכל מקרה בקוד שלנו נראה נקודת כניסה לפונקציית ההתחלה של הסוכן שיכולה לקבל מידע מהטריגר. 3. הקוד שלנו צריך להבין מתוך המידע שהגיע מהטריגר מי המשתמש ומה הוא רוצה. אחרי שהבנו את זה אפשר לטעון הודעות קודמות מבסיס הנתונים ולבנות פניה או מספר פניות ל LLM. 4. אחרי שסיימנו לטפל באירוע אנחנו צריכים להחליט מה עושים עם התוצאה. לפעמים נרצה לשלוח את התוצאה ישירות למי שהפעיל את הסוכן, למשל אם זה הודעה שהגיעה ב HTTP. לפעמים נרצה לבצע פעולה ברקע כמו שליחת אימייל או השארת Code Review בגיטהאב. ✏ קוד של סוכן שאוסף מידע מאתרי חדשות אחרי שהבנו איך עובד סוכן המשכנו לבנות סוכן לדוגמה בעזרת הספריה OpenAI Agents SDK. בעולם היום ממילא קלוד כותב את הקוד ולכן כתבנו את הפרומפט הבא:
Bootstrap the agent according to Claude.md
  in single file main.py
  Use Gemini and the OpenAI compatible chat endpoint
  Print out the daily digest to stdout
 
  Tech sites should include https://www.reddit.com/r/programming/, hackernews and whatever else you can think of
והקוד שהוא יצר בקובץ אחד בשם main.py היה:
"""News Searcher: searches tech news sites and prints a daily digest to stdout.

Built with the OpenAI Agents SDK, running Gemini through its

ToCode
1 420
📌 המודל החדש של אנטרופיק מוכיח שוב את מה שכולם רוצים לשכוח מאז שיצא fable, ששמו נשמע לי הרבה יותר כמו faible הצרפתי מאשר כמו משהו מהאגדות, הספקתי לדבר איתו לא מעט וכל שיחה מחדדת יותר את ההבנה שאולי המודלים רצים קדימה אבל היעד הוא לא מה שמספרים לקהל הרחב. בדוגמה אחת באמת מהאגדות שלחתי את פייבל להוסיף דוח למערכת. המודל חקר את הקוד, מצא פתרונות כירוגיים יפים לבעיות, מימש את הדוח החדש בתוך האילוצים של המערכת הקיימת בלי להתבלבל ואפילו התחיל לאסוף כמה נתונים חדשים כדי שאפשר יהיה לייצר את הדוח. הקוד כלל קוד צד שרת, קוד צד לקוח, אינטרקציה עם בסיס הנתונים ועוד אבסטרקציות סך הכל סדר גודל של מאות שורות בכעשרים קבצים. ואחרי כל זה הוא הפעיל דפדפן בדק את כל העבודה שלו ותיקן את עצמו עד שהכל עבד כמו שצריך. אפילו אופוס לא היה מתקרב לנחישות הזו, וזה באמת מדהים. בדוגמה אחרת ביקשתי ממנו לכתוב קוד פייתון שמשתמש ב Multi Threads כדי לספור כמה מספרים ראשוניים יש בין 1 למיליון. פייבל מימש ואפילו דאג להזהיר אותי ששימוש ב Threads למשימה זו הוא לא אידאלי בגלל ה GIL בפייתון ואולי אני רוצה לשדרג ל multiprocessing. מרשים? כמובן. מחליף אנשי תוכנה? לא ממש. דוגמת הפייתון טובה עד שנזכרים שהרבה יותר מהר לספור ראשוניים בשיטת המסננת עם Thread יחיד. בדוגמת הדוח שינוי מבנה הטבלאות במערכת היה מאפשר ייצור הרבה יותר מהיר של הדוח ופילטרים יותר מתקדמים, מה שלא ניתן לבצע במבנה הקיים. שני המקרים הזכירו לי את האמת שכולם רוצים לשכוח - העבודה של מפתחים היא לא להקליד את הקוד אלא להחליט איזה קוד לכתוב.

ToCode
1 420
📌 שלוש תובנות על פיתוח בעידן ה AI מהיוצר של Open Code הקשבתי לראיון עם דקס רד, היוצר של אופןקוד בפודקסט של Pragmatic Engineer. בחור מרתק ואני ממליץ להקשיב לפרק הזה כשיש לכם זמן. מכל הדברים אני רוצה להתיחס ל-3 תובנות שהוא מעלה על פיתוח באמצעות AI היום, שלושה דברים שתמיד היו אבל היום עם ה AI הפכו משמעותיים בהרבה: 1. הכנסת פיצ'רים שלא באמת שווים את זה - מאחר וכל כך קל להוסיף פיצ'רים אנחנו מעלים הרבה יותר פיצ'רים במוצרים שלנו. הבעיה היא שכל פיצ'ר ימשיך ללוות אותנו שנים קדימה, אנשים אחרים יסתמכו עליו ונצטרך לתמוך בו. דקס העיד שאחרי שהם ניסו לרוץ מהר ולשבור דברים היום הצוות שלהם מחפש איך ליצור צווארי בקבוק ולהעלות פחות פיצ'רים למוצר כי הם גילו שעוד פיצ'רים לא הופכים את המוצר לטוב יותר. 2. קשה יותר לשלוט בפתרונות עקומים - פעם כשהיית צריך לבנות פיצ'ר שלא בדיוק התאים למערכת היית צריך לבחור אם לחשוב מחדש על חלקים גדולים במערכת או לבנות פתרון לא מדויק ולעקם את המערכת כדי שזה יעבוד. היום בפיתוח עם AI הסוכן עושה את זה בשבילך ולסוכני קידוד יש Bias ליצירת הפתרונות העקומים. התוצאה היא שהרבה פעמים אנחנו לא יודעים שנבחר פתרון עקום ולא חושבים עד הסוף על ההשלכות ומקרי הקצה. יותר מזה, מרגע שנבחר הפתרון העקום סוכני קידוד ישתמשו ב Bias השני שלהם לתאימות אחורה וימשיכו לבנות עוד שכבות של פיצ'רים על גבי אותו פתרון עקום וכך כשאנחנו מזהים את הבעיה עלול להיות מאוחר מדי לתקן אותה. 3. עלינו להשקיע יותר זמן בניקוי הקוד - התוצאה המתבקשת של שתי הנקודות הראשונות. סוכני קידוד שרצים חופשי יבנו אינסוף פיצ'רים כי אין להם יכולת לסנן ויכניסו פתרונות עקומים למערכת עבור כל פיצ'ר כזה. הדרך היחידה להשתלט על הכאוס היא ליצור צווארי בקבוק מלאכותיים ולהשקיע יותר זמן בניקוי הקוד. ניקוי כאן הכוונה לראות פתרון עקום, לחשוב מחדש על המערכת כדי להגיע לפתרון הנכון ואז להשתמש ב AI כדי לבצע Refactor לחלק גדול מהקוד. אני רוצה לסיים בדוגמה קצרה מהפרויקט שלי לאותו רעיון של פתרונות עקומים. קומיט: https://github.com/ynonp/langlets-rails/commit/24f9d380e593a2886f8163cbf989c9405cbc7402 רציתי להוסיף ל langlets כפתור לעבור בין "מצב בהיר" ל"מצב כהה". באיטרציה הראשונה הסוכן שם כפתור מרחף בצד ימין למטה של המסך ואני ביקשתי להעביר את הכפתור לשורת הכותרת. התוצאה - הסוכן כתב את הכפתור בשורת הכותרת וגם השאיר את הקוד שמצייר את הכפתור המרחף בצד ימין למטה. אז הוא הוסיף משתנה בשם suppress_floating_theme_toggle עם ערך ברירת מחדל "אמת" שגורם לתבנית להסתיר את אותו כפתור מרחף. בלי ניקוי של הקוד הכפתור הזה היה נשאר ומופיע מדי פעם במסכים חדשים פשוט בגלל שמישהו שכח להגדיר את המשתנה. ניקוי של הקוד הוא קריטי בדיוק בגלל אותן התנהגויות מובנות של סוכני קידוד.

ToCode
1 420
📌 ארבעה פתרונות במהלך הרצאה על קלוד קוד שהעברתי היום נתתי לקלוד לפתור באג ביצועים במערכת, ארבע פעמים כל פעם עם פרומפט קצת אחר. מתוך ארבעת הפתרונות שלושה עבדו ואחד לא. השלושה שעבדו היו כולם טובים, כל אחד בדרך אחרת. מי שהיה נותן לקלוד לנסות לפתור את זה עם הפרומפט הראשון היה מתאכזב ואולי יוצא בתחושה שקלוד לא מספיק טוב בשביל לפתור את הבעיה. מי שהיה משתמש בפרומפט השני היה חושב שקלוד לא רואה את התמונה הגדולה. מי שהיה משתמש בפרומפט השלישי היה חושב שקלוד משנה יותר מדי קבצים ואפשר היה לייצר פתרון הרבה יותר פשוט. ומי שהיה לוקח את הפרומפט הרביעי היה חושב שקלוד או פזיז או גאון. אבל כולם נוצרו בדיוק מאותו סוכן ובדיוק עם אותו מודל. וכל אחד מהם מציג עוד נקודת מבט על הבעיה. כשקוראים את כל ארבעת הפתרונות הרבה יותר קל לגבש דעה על הפתרון שמתאים לנו ועל ההשפעה שלו על המשך בניית המערכת. חבל לעצור בפתרון הראשון שעובד. (נ.ב. זה אפילו לא מסובך ליצור עוד פתרונות - פעם אחת נתנו למודל לרוץ לבד, פעם שניה הפעלנו Plan Mode, פעם שלישית בכלל הפעלנו מתוך VS Code ובנינו את הפרומפט שלב שלב תוך כדי שאנחנו שואלים את קלוד שאלות על הקוד ואת הרעיון לרביעי קיבלנו אחרי ששלחנו אותו לעשות לעצמו Code Review. יש די הרבה מיץ בלימון הזה שנקרא קלוד).

ToCode
1 420
📌 איך אני מתחיל היום פרויקט חדש פיתוח Agent First שינה את סדר העדיפויות בפיתוח וחלק מהשיקולים. בעבר הייתי מתחיל בבחירת טכנולוגיה שאני אוהב, הקמה של דף קונספט קטן כדי להבין בכלל מה אני רוצה ואז פיתוח אינקרמנטלי של הפיצ'רים. היום מהירות הפיתוח שסוכני קידוד מכתיבים אומרת שאם אני לא מקבל את ההחלטות הנכונות מהרגע הראשון אני עלול להתעורר כשיהיה מאוחר מדי. זה מה שאני עושה היום כדי להתחיל פרויקט חדש בגישת Agent First: 1. תיעוד לסוכן - מוודא שיש את כל התיעוד של הספריות הרלוונטיות זמין לסוכן בקבצי Markdown. אם אין אני תמיד יכול להפנות את קלוד לתיעוד ולבקש שיבנה לעצמו Skill ממה שיש שם. 2. בחירת שפה וטכנולוגיה - הרבה פחות חשוב ממה שהיה פעם. טייפסקריפט? פייתון? רובי? ראסט? כל עוד אני יודע לקרוא את זה יהיה בסדר. מה שחשוב זה שהאקוסיסטם יהיה בשל. 3. שולח את הסוכן לבנות דף קונספט. עמוד אחד רק לראות שהכלים עובדים. 4. מסדר את כל מנגנון ה Deployment לגרסה הראשונה. הדבר האחרון שאני רוצה זה שהסוכן יחליט לשמור את המפתחות בקוד כי "זה רק MVP" או משהו כזה. 5. מתקן את מבנה הפרויקט שהסוכן יצר כדי להתאים לפרויקט שאני רוצה וכותב קובץ AGENTS.md עם תיאור הפרויקט וקווים כלליים לפיתוח. 6. מחבר דפדפן (וכלים נוספים לפי הצורך) ב MCP כדי שהסוכן יוכל לבדוק את עצמו. המשחק הוא לייצר סוכן שכותב קוד באופן עצמאי בתוך מסגרת של כללים. אנחנו עדיין צריכים לעבור על הקוד ולוודא שהוא לא יוצא מהמסגרת, אבל אם מהצעד הראשון אנחנו חושבים על המסגרת, הכללים והחופש של הסוכן אנחנו מתחילים לראות את המערכת שאנחנו רוצים לייצר.

ToCode
1 420
📌 אף אחד לא התלהב מאיכות הקוד מישהו שאל בהאקרניוז מה היה הרגע הקסום ביותר מבחינתכם בעבודה עם Gen AI. הדיון כאן: https://news.ycombinator.com/item?id=48406174 התשובות באמת מדהימות- בן אדם אחד סיפר על מדפסת שעבדה פיקס חוץ מאשר כשהדפיס בלינוקס מתוך כרום. קלוד יצא לדרך ואחרי כמה דקות המדפסת התחילה להדפיס. מישהו אחר סיפר על תוכנה שהיתה לו שהפסיקה לעבוד כי השרת שהיא ניסתה להתחבר אליו כדי לאמת את הרשיון ירד מהרשת (החברה כבר נסגרה). קלוד השתמש בכלי הנדסה אחורנית בשם גידרה, פרץ את התוכנה וביטל את מנגנון ההגנה. עוד מגיב סיפר על קודי שהיה מתרסק אחרי כמה דקות שימוש על הכרוםקאסט. קלוד התחבר למכשיר עם adb זיהה את הסיבה להתרסקות, הוריד מהאינטרנט את קוד המקור של קודי ובנה גרסה חדשה שלא מתרסקת. מגיב נוסף שלח את קלוד לבנות MNIST Classifier על FPGA בתור דמו. הוא נתן לקלוד את הכלים, יצא לאכול צהריים וכשחזר הוא יכל לצייר על המסך את המספר 2 שאכן זוהה כמו שצריך. סיפור חמישי הוא על CTO שהחזיק שתי אפליקציות קטנות, שתיהן נבנו על ידי יועצים חיצוניים בבלאגן נוראי - מיקרו סרביסים, next.js, ריאקט, וכל זה בשביל 50 משתמשים בשבוע. ה AI שכתב את שתי האפליקציות ותוך כמה ימים הגיעו לגרסה פשוטה בהרבה של מערכת עם אותם פיצ'רים, הכל עובד יותר מהר ועלויות השרת ירדו משמעותית. ויש שם עוד אינסוף סיפורים מטורפים. אין בכלל ספק ש Gen AI הוא השינוי הגדול ביותר בעולם התוכנה אולי מאז האינטרנט אולי אפילו יותר גדול. מה שלא ראיתי שם היה אנשים שהתלהבו מהקוד. לא היו סיפורים של אנשים שקראו קוד של סוכן קידוד ונפלו מהכסא. למעשה רוב המפתחים הטובים שאני מכיר כשקראו קוד של AI הרגישו שהוא צריך הכוונה וגם למודלים הכי חדשים אין את הראייה המערכתית האנושית. שאלתי גם את קלוד בשביל המשחק שיחפש ברשת וזו התשובה שקיבלתי:
When people praise AI coding on HN, the praise is almost always about capability, speed, and unblocking — "I shipped an iOS app in two weeks," "10–20x more features," "it found the bug in five minutes." The code-as-craft dimension, when it shows up at all, tends to show up as criticism: the recurring argument that AI code is "always good enough and never great" because great code requires taste and judgment about what's appropriate, what's overkill, what's elegant for this specific codebase.
מה שכלל לא תואם את הסנטימנט בחלק גדול מהתעשייה. העתיד? או שמודלים יותר טובים יגיעו ויכתבו קוד שנהיה גאים בו, או שנרד מהחלום לתת ל AI לכתוב קוד ללא השגחה.

ToCode
1 420
📌 לכתוב או לחשוב הנה מטריקה טובה כדי להבין אם אתם משתמשים נכון ב AI לקידוד. רשמו בסוף היום: 1. כמה זמן כתבתי פרומפטים? 2. כמה זמן קראתי קוד, תשובות של AI וחשבתי על הבעיה? אם יש משהו ש AI צריך ללמד אותנו זה שהמטרה היא לחשוב יותר, לא לכתוב יותר.

ToCode
1 420
📌 מי בכלל צריך לכתוב סוכנים? אתמול בוובינר אחת השאלות הקשות בעיניי היתה "בשביל מה בכלל צריך לכתוב סוכן?", או בגרסה אחרת "זה רק בשביל Chat?". באותו רגע לא הייתי בטוח איך לענות אז כרגיל במקרים כאלה אני מנסח את התשובה הארוכה כאן לבלוג. כשאנחנו מסתכלים על האינטרנט היום מצד אחד אנחנו מתקשרים עם המון סוכנים אבל באותו זמן בגלל שכולם כותבים סוכנים לא לגמרי ברור למה שנרצה עוד אחד. מה אפשר לעשות עם סוכן שלי שאי אפשר לעשות בשיחה רגילה עם ה ChatGPT? צריכים לכתוב קוד? יש כבר סוכן לזה. צריכים לתרגם? מישהו כתב סוכן לזה. צריכים לשאול שאלה את תיבת הג'ימייל שלכם? גוגל ישמחו לשים שם את ג'מיני שיענה. צריכים לבנות תוכנית טיול? שימו את כל הלינקים ב Notebook LM ותנו לג'מיני לסדר אותם לפי ימים. צריכים להזמין טיסה? צ'ט ג'יפיטי ישמח להתחבר למערכת של חברת התעופה ולהזמין לכם, ואולי אפילו להראות פרסומת בדרך להשכרת רכב (גם אם לא היום זה תכף מגיע). השאלה הגדולה אנחנו מסתכלים על העתיד של סוכנים כמו "דפדפני אינטרנט" או כמו "אתרים"? האם אני אכנס באופן קבוע ל ChatGPT ודרך ממשק השיחה איתו אמשיך לבצע פעולות במערכות אחרות, או שלכל מערכת יהיה את הסוכן שלה? אם העתיד הוא האפשרות הראשונה באמת אין טעם לבנות סוכנים. הרבה יותר חשוב לבנות API טוב ש ChatGPT או מתחריו יוכלו להשתמש במערכת שלי, כמו שאני בונה אתר בטכנולוגיות ווב כדי שייפתח טוב בכל הדפדפנים. אבל אם סוכנים הם הדור הבא של אתרי אינטרנט אז ברור שכל מי שהיום מחזיק אתר יצטרך להוסיף אליו סוכן, בדיוק כמו שהוספנו אתר מותאם ואפליקציה. לשאול "למה צריך סוכן" זה קצת כמו לשאול "למה צריך אתר מותאם למובייל" ב 2010. באותו רגע באמת רצינו לדחות את כאב הראש הזה, אבל עד 2015 כבר לא היה צריך לשאול. אני אישית חושב שסוכנים יהיו יותר כמו אתרים מאשר כמו דפדפנים מהסיבות הבאות: 1. קל מאוד לכתוב סוכן וממילא המשתמש מדבר עם הסוכן דרך דפדפן. אין בעיית הפצה. 2. פיתוח סוכן נותן לי שליטה מלאה על החוויה של הלקוח. מה הגולש רואה, מה מציעים לו, איזה פרסומות יש מסביב, איך הממשק של השיחה מתחבר עם דברים נוספים באתר. שאלתי את Gemini ו ChatGPT בשביל המשחק. שניהם בטוחים שבעתיד הם ישלטו בעולם, אף אחד לא יכתוב סוכנים וכולנו רק נספק "ממשק" דרכו גולשי ChatGPT יוכלו להשתמש במוצר שלנו אבל עדיין להישאר ב ChatGPT. אני חושב שהם טועים. העתיד יגיד. עד אז אפילו אם אתם לא צריכים לבנות סוכן אני חושב שזאת חוויה מעניינת. סוכן הוא בסך הכל אוטומציה של תהליך שקורה אצלכם ממילא ומשלב מודל שפה. הנה כמה דוגמאות של דברים שאפשר לבנות כבר היום רק בשביל המשחק והלמידה: 1. סוכן שמקבל אימיילים ושומר חשבוניות או מסמכים מצורפים לתיקיית רשת. 2. סוכן שמקשיב להודעות בטלגרם ומתרגם את הטקסט לשפה אחרת. 3. סוכן שכל ערב שולח לכם תקציר חדשות מותאם אישית לנושאים שמעניינים אתכם. 4. סוכן ששולח אוטומטית Code Review על כל PR פתוח. 5. סוכן שעונה על שאלות על המוצר שלכם. 6. סוכן שמשחק נגדכם איקס עיגול. 7. סוכן שמחזיק רשימת קניות. שולחים הודעה בטלגרם כשחסר משהו והודעה אחרת בטלגרם כשאנחנו בסופר. 8. סוכן ששולח בשמכם ברכת יום הולדת מקורית לחברים לאימייל (או משאיר הודעה בפרופיל החברתי שלהם). 9. סוכן שקרא את כל הפוסטים מהבלוג הזה ויודע לענות על שאלות לגביהם. 10. סוכן בטלגרם שעוזר לכם להכנס לכושר באמצעות שליחת תוכנית אימונים והודעות מוטיבציה ומעקב. 11. סוכן כרטיסיות - הוא גם מתרגם בשבילכם מילים וגם שומר אוטומטית כרטיסיות. מדי פעם תוכלו לבקש שיבחן אתכם ואז הוא שולף את הכרטיסיות לראות שאתם זוכרים. 12. הסוכן הבוחן - תנו לו לינק למאמר או פוסט והוא יתחיל לשאול אתכם שאלות על הטקסט כדי לראות שאתם מבינים אותו לעומק. האם אפשר לכתוב את כולם או חלקם בגישת No Code עם כלי אוטומציה קיימים? ברור. האם שווה לכתוב את הקוד לבד כדי להבין איך דברים עובדים מבפנים? אין שום ספק.