El desarrollo web implica la creación de sitios web para internet o una intranet.
Puede incluir desarrollo ed una simple página de texto estático, hasta aplicaciones web complejas, redes sociales, y aplicaciones de negocios
Se divide en dos partes principales: el desarrollo de front-end (la parte del sitio web con la que interactúan los usuarios)
Puede incluir desarrollo ed una simple página de texto estático, hasta aplicaciones web complejas, redes sociales, y aplicaciones de negocios
El desarrollo de back-end (la parte "tras bambalinas" que maneja la lógica y la base de datos de un sitio web).
Puede incluir desarrollo ed una simple página de texto estático, hasta aplicaciones web complejas, redes sociales, y aplicaciones de negocios
chatGPT
Puede incluir desarrollo ed una simple página de texto estático, hasta aplicaciones web complejas, redes sociales, y aplicaciones de negocios
const { data: unknownAssetsBalances } = useQueriesData( unknownAssetsIds.map((id) => ({ ...queries.assets.balances.addressToken(addressHash, id), enabled: unknownAssetsIds.length > 0 })) ) let tokensWithBalanceAndMetadata = flatMap(tokenBalances, (t) => { const metadata = find(fungibleTokens, { id: t.id }) return metadata ? [{ ...t, ...metadata, balance: BigInt(t.balance), lockedBalance: BigInt(t.lockedBalance) }] : [] }) tokensWithBalanceAndMetadata = sortBy(tokensWithBalanceAndMetadata, [ (t) => !t.verified, (t) => !t.name, (t) => t.name.toLowerCase(), 'id' ])
(my)
const { data: unknownAssetsBalances } = useQueriesData( unknownAssetsIds.map((id) => ({ ...queries.assets.balances.addressToken(addressHash, id), enabled: unknownAssetsIds.length > 0 })) ) let tokensWithBalanceAndMetadata = flatMap(tokenBalances, (t) => { const metadata = find(fungibleTokens, { id: t.id }) return metadata ? [{ ...t, ...metadata, balance: BigInt(t.balance), lockedBalance: BigInt(t.lockedBalance) }] : [] }) tokensWithBalanceAndMetadata = sortBy(tokensWithBalanceAndMetadata, [ (t) => !t.verified, (t) => !t.name, (t) => t.name.toLowerCase(), 'id' ])
(my)
ITERATE
(a lot)
const { data: unknownAssetsBalances } = useQueriesData( unknownAssetsIds.map((id) => ({ ...queries.assets.balances.addressToken(addressHash, id), enabled: unknownAssetsIds.length > 0 })) ) let tokensWithBalanceAndMetadata = flatMap(tokenBalances, (t) => { const metadata = find(fungibleTokens, { id: t.id }) return metadata ? [{ ...t, ...metadata, balance: BigInt(t.balance), lockedBalance: BigInt(t.lockedBalance) }] : [] }) tokensWithBalanceAndMetadata = sortBy(tokensWithBalanceAndMetadata, [ (t) => !t.verified, (t) => !t.name, (t) => t.name.toLowerCase(), 'id' ])
(my)
DON'T BE SCARED TO TRY
(live)
ITERATE
(a lot)
const { data: unknownAssetsBalances } = useQueriesData( unknownAssetsIds.map((id) => ({ ...queries.assets.balances.addressToken(addressHash, id), enabled: unknownAssetsIds.length > 0 })) ) let tokensWithBalanceAndMetadata = flatMap(tokenBalances, (t) => { const metadata = find(fungibleTokens, { id: t.id }) return metadata ? [{ ...t, ...metadata, balance: BigInt(t.balance), lockedBalance: BigInt(t.lockedBalance) }] : [] }) tokensWithBalanceAndMetadata = sortBy(tokensWithBalanceAndMetadata, [ (t) => !t.verified, (t) => !t.name, (t) => t.name.toLowerCase(), 'id' ])
(my)
ITERATE
SIMPLE IS BEAUTIFUL
(but simple is hard)
DON'T BE SCARED TO TRY
(live)
(a lot)
const { data: unknownAssetsBalances } = useQueriesData( unknownAssetsIds.map((id) => ({ ...queries.assets.balances.addressToken(addressHash, id), enabled: unknownAssetsIds.length > 0 })) ) let tokensWithBalanceAndMetadata = flatMap(tokenBalances, (t) => { const metadata = find(fungibleTokens, { id: t.id }) return metadata ? [{ ...t, ...metadata, balance: BigInt(t.balance), lockedBalance: BigInt(t.lockedBalance) }] : [] }) tokensWithBalanceAndMetadata = sortBy(tokensWithBalanceAndMetadata, [ (t) => !t.verified, (t) => !t.name, (t) => t.name.toLowerCase(), 'id' ])
(my)
ITERATE
SIMPLE IS BEAUTIFUL
(but simple is hard)
DON'T BE SCARED TO TRY
(live)
(a lot)
(especially for engineers)
const { data: unknownAssetsBalances } = useQueriesData( unknownAssetsIds.map((id) => ({ ...queries.assets.balances.addressToken(addressHash, id), enabled: unknownAssetsIds.length > 0 })) ) let tokensWithBalanceAndMetadata = flatMap(tokenBalances, (t) => { const metadata = find(fungibleTokens, { id: t.id }) return metadata ? [{ ...t, ...metadata, balance: BigInt(t.balance), lockedBalance: BigInt(t.lockedBalance) }] : [] }) tokensWithBalanceAndMetadata = sortBy(tokensWithBalanceAndMetadata, [ (t) => !t.verified, (t) => !t.name, (t) => t.name.toLowerCase(), 'id' ])
(my)
ITERATE
DON'T BE SCARED TO TRY
DON'T REINVENT THE WHEEL
(but sometimes do)
SIMPLE IS BEAUTIFUL
(but simple is hard)
(live)
(a lot)
(especially for engineers)
const { data: unknownAssetsBalances } = useQueriesData( unknownAssetsIds.map((id) => ({ ...queries.assets.balances.addressToken(addressHash, id), enabled: unknownAssetsIds.length > 0 })) ) let tokensWithBalanceAndMetadata = flatMap(tokenBalances, (t) => { const metadata = find(fungibleTokens, { id: t.id }) return metadata ? [{ ...t, ...metadata, balance: BigInt(t.balance), lockedBalance: BigInt(t.lockedBalance) }] : [] }) tokensWithBalanceAndMetadata = sortBy(tokensWithBalanceAndMetadata, [ (t) => !t.verified, (t) => !t.name, (t) => t.name.toLowerCase(), 'id' ])
(my)
DON'T REINVENT THE WHEEL
(but sometimes do)
ITERATE
(a lot)
DON'T BE SCARED TO TRY
(live)
SIMPLE IS BEAUTIFUL
(but simple is hard)
(especially for engineers)
Alephium when I joined in 2019
ITERATE
(a lot)
Principle #1
ITERATE
(a lot)
Principle #1
ITERATE
ADAPT
EVOLVE
Alephium
In 2023
Back in 2017 I thought that the industry was getting mature. That the bull run would finally bring blockchain to the masses.
I thought that 2009 to 2017 was enough time to iterate.
ITERATE
ITERATE
ITERATE
ITERATE @
ITERATE @
DON'T REINVENT THE WHEEL
(but sometimes do)
ITERATE
(a lot)
DON'T BE SCARED TO TRY
(live)
SIMPLE IS BEAUTIFUL
(but simple is hard)
(especially for engineers)
(my)
If it's not good, fail fast and iterate.
You won't know it's good until your users tell you it's good.
DON'T BE SCARED TO TRY
(live)
Principle #2
If it's not good, fail fast and iterate.
You don't know it's good until your users tell you it's good.
DON'T BE SCARED TO TRY
(live)
Principle #2
DON'T REINVENT THE WHEEL
(but sometimes do)
ITERATE
(a lot)
DON'T BE SCARED TO TRY
(live)
SIMPLE IS BEAUTIFUL
(but simple is hard)
(especially for engineers)
(my)
SIMPLE IS BEAUTIFUL
(but simple is hard)
(especially for engineers)
How do you design an efficient, easy-to-trust and easy to use tool...
...without sprinkling useless noise all over your designs?
...without appearing too gimmicky or too gamified...
...without being cold and boring...
Principle #3
SIMPLE IS BEAUTIFUL
(but simple is hard)
(especially for engineers)
How do you abstract the complexity of the code you know by heart...
...while leveraging the full potential of what you've built.
How do you design an efficient, easy-to-trust and easy to use tool...
...by sprinkling useless noise all over your designs?
...without appearing too gimmicky or too gamified...
...without being cold and boring...
Principle #3
SIMPLE IS BEAUTIFUL
Hide complexity by default
Principle #3
SIMPLE IS BEAUTIFUL
Add fun little details
SIMPLE IS BEAUTIFUL
Focus on current action
SIMPLE IS BEAUTIFUL
Focus on current action
DON'T REINVENT THE WHEEL
(but sometimes do)
ITERATE
(a lot)
DON'T BE SCARED TO TRY
(live)
SIMPLE IS BEAUTIFUL
(but simple is hard)
(especially for engineers)
(my)
DON'T REINVENT THE WHEEL
(but sometimes do)
- Get inspired by the best.
- Always compare your products with the mainstream (widely adopted) products. Don't build blindly.
- It's not because we're not big that we can't do big things.
And sometimes you're convinced that you can do better than most. If the risk isn't huge, just try. You may just be right! If not... fail and iterate.
Principle #4
DON'T REINVENT THE WHEEL
(but sometimes do)
Extension frustrations
Principle #4
Thank you
Thank you
I'm looking forward to building more great things for you.