Good afternoon and welcome to the Pennsylvania Press Club. I'm John Bair of the Philadelphia Daily News and your host for today's luncheon. Joining me at the head table are Warren Udack from Udack & Company and John Pippi from the Pennsylvania Coal Association. Thank you both for your support and thank you for being here. The 2015 Pennsylvania Press Club Luncheon Series could not be possible without the support of those organizations listed on our sponsor banner. Today's luncheon is being taped and will be carried throughout Pennsylvania to the television audience of the Pennsylvania Cable Network. Our speaker today is Governor Tom Wolf. In the interest of time and because we have so many questions, I'm going to give you the tabloid version, Ivy League Peace Corps University of London Ph.D. from MIT. Then a cabinet maker, a cabinet official, an unknown candidate, Democratic nominee elected governor drives a jeep. Wants Pennsylvania to have jobs that pay, schools that teach and government that works and he's here to tell us how that's going. Please welcome Governor Tom Wolf. Thank you so much John for that really nice introduction, that was very nice. It's really good to be here and thank you all for coming out. It's a wonderful week as you know this is Thanksgiving week and so I want to wish all of you a very happy Thanksgiving. Thank you for being here and happy Thanksgiving. This is a great week and a great time to be with family, that's what I intend to do, to eat well and to counter blessings and to say thanks for them. Of course I can't help but say that one of the blessings we cannot yet count on is a budget for Pennsylvania. We've been out without one for this entire fiscal year and that fiscal year began on July 1st. Just five months ago. Since then many of the organizations that rely on the state for crucial funding have continued to wait for payment. Counties, schools, non-profits have all done their best to make ends meet by dipping into reserves if they had them. Cutting services are more often both. Many of our fellow citizens have had to do without services and things they desperately need. Clearly we must end this nonsense and that's what I want to talk about today. I want to encourage all of my colleagues here in Harrisburg to do the people's business. Let's get back to work. To finish the job and reach agreement on a real budget based on the framework we announced just a few weeks ago publicly. To a certain extent our prolonged budget deficit, budget debate is a natural, a natural function of divided government. We have a democracy here. No one can get everything she or he wants in such a government. Compromise is essential. It's of the essence. And many of us have tried to do just that. Compromise. I made my initial proposals in March where I called for a number of things I believe were necessary for moving Pennsylvania forward. I called for a truly, a truly balanced budget. I called for an end to the smoke and mirrors of the budgets of the past and end to budgets that only pretended to balance but didn't really balance. I called for a real increase in funding for our schools and for our children, for basic education, for early childhood education, for special education, for head start. I called for a shale tax that would be used to provide funding for our schools, again, and our children. I called for a massive drop in the corporate net income tax rate from its obscenely high rate of 9.99% to 4.99%. I called for real property tax relief, $3.8 billion worth, that would help working citizens and seniors who are at risk of losing their homes because of the never ending rise of school taxes in their local communities. And these taxes, this property tax relief, would also help municipalities whose citizens are stuck with local school tax bills that are just too high. And I called for an increase in recurring revenues to do all of this honestly. I thought it was a reasonable, practical budget proposal. I thought it would get a fair hearing. I was wrong. The budget proposal I got in response from the Republicans on June 30th had none, none of the things I believe Pennsylvania needed. For a start, it did not balance. The math didn't work. It had more of the same smoke and mirrors that had led rating agencies to downgrade our debt five times in four years, three times just last year alone. There was no real investment in education, just a modest increase, and there was no mention of a shale tax, there was no property tax relief, and no recognition that we had to move away from the bad budgeting habits of the past and actually try to pay for the public goods our fellow citizens continue to want, again, without recurring revenue. Remember, the legislature actually went through this exercise with the need for recurring revenue in 2013 with Act 89. And they did come up with recurring revenue of more than $2 billion to fix our bridges and to fix our roads. So I tried again. A few weeks ago, I thought we had come to a meeting of the minds, finally, after months. Republican leaders Reid and Corman stood with me at that time to announce, to many of you, a framework for a budget deal that would address many of the issues I just outlined. That framework included a number of things, both liked along with a number of things that we didn't like. It brought us much closer to a budget that was truly in balance. It proposed a historic increase in education funding, including $350 million for basic education. It proposed historic property tax relief. It proposed real pension reform. It proposed real liquor reform. And it proposed paying for this with an increase in a broad-based tax, the sales tax, rather than an increase in the personal income tax, or some combination of the two which might have been better. But that's a compromise. Also, the framework did not include a shale tax. It was a compromise. Since then, we have been working with these same Republican leaders to work out the details of this framework. Unfortunately, that work looks like it's in peril, deep peril. The Republicans have been unable to muster the votes they need to transform this agreed-upon framework into a real budget. Instead, they passed a liquor privatization bill that is identical to the one I vetoed in June. I'm not sure why. And the Senate Republicans made clear their intention or their effort to pass Senate Bill 76, a bill I oppose, and that was not part of our framework agreement. All of these are distractions. All of these things are prolonging the process. None of them seem to be getting us any closer to the budget we need. Then late last week, Republicans told me, leaders told me that they didn't have the votes to deliver on the property tax relief, the key component of that framework. In other words, the framework was not going to become a budget. I deeply regret this. We had within our grasp a budget framework that would have been transformational for Pennsylvania. It would have done much of what so many Pennsylvanians want their government to do, show fiscal responsibility, invest in our children, invest in our schools, produce real local property tax relief, put our public pension system on a firm financial foundation, bring our liquor system into the 21st century. I want to encourage my fellow public servants here in Harrisburg to do what we said we were going to do. We said we would deliver a budget by Thanksgiving. Three days, we have to get to that deadline. That's the way it is. It's time we deliver and the Republicans need to find their votes on the bipartisan agreement we made.  This would still leave work to be done next year. No question about it. It is a compromise. The framework does, as far as I'm concerned, leave gaps. We are still the only major gas producing state in the country without a tax on gas drillers. We need a severance tax. We need property tax relief. Both will be part of my next budget proposal. I would have preferred that the recurring revenue come from the personal income tax rather than the sales tax. I didn't get that. I would have wanted rent relief for families. I didn't get that. But if we can at least implement a budget based on the framework we announced publicly a few weeks back, Pennsylvania will be in a much better place. On the balanced budget, let's keep overall spending to $30.75 billion. We agreed on that. And reduce one-time fixes from the $2 billion that Moody's and Fitch and Standard and Poor's said was in the 2014-15 budget, reduce that to $700 million. It's not eliminating the smoke and mirrors altogether, but it's making a big down payment with the goal of eliminating one-time fixes by the 16-17 budget. On education, let's raise our investment in basic education by that $350 million figure. Let's increase special education by $50 million. Let's increase early childhood education by $50 million and head start by an additional $10 million and increase funding for higher education for the first time in many, many years. The funds for basic education would be distributed fairly according to a negotiated formula. On public pensions, the public pension system should be changed for new employees moving forward. This is a compromise. It would be a side-by-side plan, defined benefit, defined contribution with a 401k-defined contribution plan. Both would start at $1 of compensation. This plan would reduce the Commonwealth's unfunded liability by $10 billion or more over the next 30 years. On liquor reform, the liquor system would be reformed by leasing out, this is according to the framework. This is not something I'm making up right here. The liquor system would be reformed by leasing out the system with the appropriate safeguards for current employees and others to whom contracts have been led to a qualified private manager. The private manager would be hired after an objective bidding process. This is what you do in the private sector, by the way. The bidding process would be carried out with the assistance of a qualified consultant. Again, what you do in the private sector. The system would be freed of the business restrictions that currently reduce customer convenience and profitability. All I want is to restart the bipartisan framework we all agreed to. Let's get that stalled process moving forward again. I urge Republican leaders to gather the votes they need to get this budget work done quickly. As I see it, they have three logical choices. One, they can run a budget that adheres to our framework with a level of support we need to assure the passage. That would be great. Second, they can block such a budget and continue our wasteful impasse. Or third, they can present me with any full year spending plan that can pass by next Friday. Democracy requires compromise. I get that. And I have compromised time and time again. I've compromised on liquor, on pensions, on property taxes, on rent relief, on the shale tax. But the same democracy that requires us to compromise also gives us the power to hold our elected leaders accountable. If Republicans continue to perpetuate the irresponsible and unworkable status quo, then it will be the voter's turn to hold them accountable. The ball is now in the Republican's court. I am calling for a renewed effort because Pennsylvania needs a budget now. I'm encouraging Republican leaders to get back to work to get the votes for the various proposals we have already agreed to. We cannot allow ourselves to get stuck trying to work out the details of a framework we all agreed to. I believe there are enough decent members of the General Assembly in both parties, Republicans and Democrats, who want to move beyond this terrible, nonsensical budget impasse. And who want a practical budget that does the things our fellow Pennsylvanians tell us they want in a budget. That's what I'm proposing to do. Nothing more, nothing less. Let's pass a budget that works and let's do it soon. I look forward to the Republican response. Thank you very much.


Ladies and gentlemen, please rise for the march on of the colors and remain standing for the playing of the United States and Japanese national anthems Ladies and gentlemen, please be seated to Brigadier General Brian and Wolfer Subjects relinquishment of command effective 0800 24 June 2022 you stand attached from your duties as the commanding general third Marine logistics group and are directed to assume Your duties as commanding general You are directed to assume your duties as the commanding general third Marine logistics group signed David H. Berger General United States Marine Corps Commandant of the Marine Corps the evolution and the eternal life of the MLG as we transition from me to Adam Been around all the Marines and sailors over the last couple of weeks So I've said my piece with them, but there are a few things that I do want to say before you hear You have the Marines the small muscles that allow the meft to keep moving and get where they need to go And of course got medical and dental on the end. We've done fantastic today, but they're the blood that heals us and keeps us healthy This is an absolutely awesome day that we're celebrating here at third MLG It's all about these Marines and sailors that are standing behind us that are assembled here that represent all of the great Marines and sailors That form our outstanding you The commander of truth for combat logistics regiment 37 Color guard the color sergeant is Sergeant Marvin show


This is the sin that nobody wants to talk about. You won't hear about it in church, but it's so important that we address it. Just a fair warning, in this video we're going to be talking about sexuality, physical intimacy, pornography. If that's going to be a problem for you, put this video on hold and come back to it later when you're ready. One of the reasons we can have such honest and frank conversations on this channel here, one of the reasons that I don't shy away from these tough topics is because I have the base of people that support me on Patreon, so I don't have to worry too much about this video getting suppressed on YouTube or not getting passed around as much or monetization being suppressed because I have you guys on there that support me. If you want to get behind what I'm doing and create a sustainable ministry where I can continue to make this content, head on over to Patreon. You can get access to all sorts of rewards. We do video streams bi-weekly. We also have exclusive videos on there and our Discord, so if that interests you check it out. It will be a huge blessing. Now without further ado, let's dive in. Now some people say that masturbation is just normal and it's natural. You'll even hear this from people that call themselves Christians as well. They say Jesus didn't really say anything about masturbation, so we're good. But I want to hone in on something that Jesus said in Matthew 5. When he talks about if you look at a woman to lust after her, you've already committed adultery with her in your heart. We need to understand there that Jesus is honing into the heart intent, the heart desire and not just the physical act. One of the resources that I utilized for this video is a book by Tim Chalice called Sexual Detox. I want to recommend it for you guys because it is very, very beneficial if you want to go deeper in on this issue. One of the things he points out in the book is just as abortion specifically isn't mentioned in the Bible, we have many verses about the value of human life, of the dignity of being knitted together in our mother's womb and how we are fearfully and wonderfully made and how that has direct application to the issue of abortion today. Similarly, when we look at this issue of lust and from our hearts and this desire, the sexual immorality, we can apply this directly to masturbation as well. Something where we're looking and we're trying to gain sexual gratification, instant gratification outside of the context of marriage, of that covenantal relationship. And so we can see, okay, that's not part of God's design. In Genesis, we learn about the first man, Adam, and how God said, hey, it's not good that man should be alone and he created a help meet for him in Eve. And that the man shall leave his father and his mother and become one flesh with his wife. That was God's design from the beginning.  And so for looking at masturbation, we're seeing, okay, this is an isolated act done for self-pleasure. It is a selfish act. It is contrary to kind of the self-giving sexuality that God calls us to in marriage. I know I can say all this to you and you're saying, okay, I get it, Isaac. It's not good that I'm doing this. But I think it's also important that we understand, okay, why are we so drawn to masturbation? For you, ask yourself some introspective questions like why is your heart so drawn to it? Why do you want to go to this place again and again? Is it loneliness? Do you feel this deep sense of lack of connection in your life? Maybe it's a sense of hopelessness. I'll never find a partner. I'll never get married. And so this is kind of the only sexual relief that I'll ever get. And so there's this lack of hope there. Maybe it's anxiety where you're like, I just, my life isn't going well. I'm just anxious about all these different things. I have this kind of sense of I need to get control, but I don't have control because my life is out of control in a lot of ways. And this is a sense of peace and relief that I can find that is, that I can be in control of. Now when you masturbate, there's going to be a deep sense of guilt or shame, at least as a Christian because our conscience, we're being convicted by the Holy Spirit saying, hey, this isn't what's best for you. This isn't what God wants for you. This is this kind of counter to God's design. It isn't just kind of counter to God's design. It is counter to God's design. And so you're being convicted in this way, but it's important to know that it's not just about the act itself. That's the sin. There's a deeper issue going on. And that's why I want you to be a little bit introspective here about what are these kind of core beliefs or core fears or core anxieties or core desires that are leading you continually to keep on the cycle. One of the really damaging aspects of masturbation that I hadn't thought about too much until reading that book by Tim Chalice was that it creates kind of an unrealistic expectations for your future partner.  And that's just ridiculous. That's just that can't happen. And you also are training yourself to only be able to gain sexual satisfaction based on those fantasies. Similarly to pornography, when you're feeling yourself with more and more intense and extreme scenarios, you're putting that expectation on your future partner in order for you to feel that sexual fulfillment, which is obviously just messed up. Now, back to the topic at hand. When God designed sexuality, he designed it to be a fruitful endeavor. When we talk about fruitful, we talk about fruitful relationally, sexually and physically like in reproduction. So relationally fruitful in that it bonds to to become one, that they are united, that that relationship is bolstered by that kind of intimacy. Then when we talk about sexually fruitful, it is pleasurable. That's part of God's design. It's not just kind of mechanical. This is only for having children know the pleasure aspect is a big part in it. And that's where the selfless component becomes really prominent because you're not going into this relationship, this physical intimacy in order to merely get, but rather to give. You're looking to selflessly fulfill their desires above your own. Then physically fruitful, your reproduction, you're having children. Obviously, not every couple is able to have children, but this is kind of a core element to how God designed sex in marriage. When we talk about masturbation, then is that fruitful relationally? No, not at all.  Is it fruitful sexually? Well, some might see it that way. It's instant gratification. You can get off when you want to. But truly, if it's not the way that God designed it, it's just such a small taste of what God had actually invited us into in proper context, like if sex is inside of marriage, how beautiful and how life giving that is as opposed to the shame and the guilt that comes after, after masturbating. It feels good for a moment, but ultimately leads you to guilt and to shame. And it definitely doesn't lead to being fruitful physically. If anything, it actually inhibits your motivation as a man, specifically to pursue the calling that God has on your life to take responsibility to ultimately find a woman and to marry her and to have kids and provide for them. Like you're being pacified by masturbation to this low level of achievement and into thinking that that's OK and that's good. So it's not fruitful at all in that context. And you stay isolated. Now, I want to be honest with you here.  Notice I put the through Christ there because if you're doing this on your own, if you're just trying to overcome this by willpower or just pragmatic beliefs that my life will become just better if I stop doing this. So I should just stop. It won't work. It won't be enough. Ultimately, what we need to do is understand the gospel. What is the gospel? The gospel is the fact and the reality that God through Jesus has overcome sin. The power of sin in our life that we have been forgiven when we put our faith in Jesus, that we have been our shame has been washed away, that we are no longer guilty before him. And then rather now as Christians, as those who have repented for our sin, we can turn to Christ boldly asking for forgiveness, confessing our sins, but recognizing that we are clothed in Jesus' righteousness and that nothing could separate us from the love of God as his children.  This was the game changer for me realizing that God's power and presence is with me all the time as his child. I have his power and his presence with me. So that means even in those moments of isolation, God is present. He is not distant and he wants to meet us even in the midst of our pain or anxiety or loneliness. He wants to meet us there. And also after you sin, he wants to meet us in the midst of our shame and our guilt to provide forgiveness and and lift us off of the ground to point us ultimately to the forgiveness that he has enabled and also just walking with him in the spirit that we would not gratify the desires of the flesh. Two practical steps before we go today and I want you to follow through on these. The first one is go through your phone context. Who is it in your life that you trust that you can share this with? I want you to send them a text now to say, hey, I've been struggling with this. Maybe even a phone call, but I know that can be a lot for somebody. So even just begin with a text, say, hey, I've been struggling with this. It's a problem in my life. I need to be honest and open about this to get it out of just my isolated state. And can you keep me accountable on this? Can you ask me about this? Is it OK if I phone you or text you when I'm tempted? Is that all right?  They're going to be more than willing to say, hey, yeah, of course, thank you for being honest and open and vulnerable enough with me to share this and just do it today. Do not delay on this. It is going to be the most important step to getting you to helping you break free from this. The second thing is that masturbation is often fueled by pornography. And so we want to put up some accountability in order to make that step a lot more challenging. What I want you to do is click the link in my description and sign up for Covenant Eyes.  I've heard it's been a tremendous help to many men and women that have helped them break free from pornography. So click the link in my description and sign up for that as well. Thanks so much for watching this video, guys. If you enjoyed it, subscribe because I'm putting out new videos every single week. You can follow me on other platforms as well, like Instagram and TikTok at its Isaac David. Until next time, I will see you later. God bless.


Videos are a great way to increase the impact of your research and share your findings with a wider audience. But how can you be sure it's getting the attention you want? Here, we'll go through how to keep tabs on your video's success. You can use these tips for any other research content you want to track too. With billions of users across the globe, Google's YouTube is the leading video sharing service and an ideal platform for your video. On your page, take a look at the total number of views tallied on the right hand side. Each time the video was watched, the number goes up. Users also have the option to rate the video by selecting the thumbs up or thumbs down buttons. Be sure to scroll down to the comments section too, to see if anyone has left questions or notes. Click on statistics for even more detailed information, such as viewing trends, the total number of minutes your video has been streamed, and the number of times users have shared the video link. Vimeo, another video sharing site, is a great place to showcase newly published research. Vimeo provides four metrics for tracking video performance. The plays count is the total number of times the video has been viewed. Next is a tally of all the times users have enjoyed your video enough to click the heart-shaped like icon. Collections indicates the number of times your video has been added to other user channels. And finally, there are viewer comments, which can be displayed by clicking on the bubble icon or scrolling down. The ultimate goal of your video is to connect people with your published paper. There are a number of ways to find out if your paper is gaining traction, and a good place to start is your journal's website. Your journal may provide the number of article views and downloads directly on your article page. Another useful tool is the Altmetric bookmarklet, which compiles press and social media mentions for recently published articles. Altmetric links you to online conversations about your research, so you can see who is talking about your research. Simply add the Altmetric it button to your bookmarks, then click the button when you've navigated to a journal article of interest to see the Altmetric data. If you are interested in citations, check out Google Scholar's powerful search engine. You can search for statistics on your article by entering your name, affiliation, and other search criteria on the My Citations page. Also consider connecting with other scientists and making your research visible through ResearchGate's online community. This site allows you to share your research and track statistics on your viewer network. To make your video accessible to broader audiences, set up an account on Kudos, where you can efficiently track the impact of your work. To see those play counts tick upward and get the word out about your research, share your video widely and often with colleagues, as well as friends and family.


Alright guys, I think we're gonna go ahead and get started here. This is the features in Rails 5 that you haven't heard about. My alternate title was Sean dramatically reads the changelog, but I don't have a great dramatic voice. So instead this will be Sean undramatically reads the changelog. No, actually the main focus of this talk is less about the features themselves and more about the stories that went into implementing them. This is, we're gonna focus on the smaller quality of life changes. Those are the sort of things that I get excited about every time Rails updates. Yeah, once I get started it'll be fine because I'll actually be pressing buttons on the keyboard. Anyway, what I get excited about with every version of Rails is the smaller quality of life features. The things that aren't gonna fundamentally change how I build applications, but the things that are gonna make my life just a little bit easier. The smaller tools, the new protections, performance improvements, and a lot of them have very interesting stories that went into why they were added or in some cases why they weren't added. So that's what we're gonna talk about today. My name's Sean Griffin. I work full time on open source. I'm a committer on Ruby on Rails. Shopify sponsors me to do open source full time, so thank you Shopify. And as I was saying, every feature has a story about it. What went into implementing it, why it was added, and in the case of things like relation or why they weren't added for as long as they were. Now the first feature that I'd like to talk about is one I've spoken a lot about in the past and it's the typed attributes API. This one's actually kind of interesting to put in a thing about Rails 5 because most of the work that went into implementing this feature was actually done in Rails 4.2. In Rails 4.2 we revamped the entirety of how we handle type coercion, active record, and preparation for this public API. And the API is 90% implemented in 4.2 with a handful of edge cases. And I've talked at length about this in the past, but I don't think I've ever told the story of why this feature was added. And there were a lot of things that led up to it, but really there was one particular project that stood out as the thing that really convinced me that this was a project that we needed. It was something I was working on while I was still at Thoughtbot. And the project had the requirement that all data needed to be encrypted at rest, including if our database credentials were leaked. So if you actually had access to the database, you still needed to be unable to read anything. So we were using a gem called adder encrypted to start. And this is what using that gem looks like. You call adder encrypted and you give that the name of an attribute. And it will assume that the database column is called that attribute name underscore encrypted. It defines a reader and a writer for the unencrypted form and performs the encryption in Ruby. The problem there is that it doesn't work with methods like where or find by. Now there was a feature at the time that has since been removed, and this is an example of the code that doesn't work, but there is an escape hatch that used to give you that has since been removed in that the dynamically defined finder methods such as this form were defined. But this isn't how we tend to write Rails applications anymore and haven't since Rails 2.3. So using this gem would mean that our entire application would have to change to know that this field happened to be encrypted in the database. Now we ended up using gems like ransack for complex search. And so we ended up having to, the attributes API didn't end up even fixing what this specific project needed because we needed to be able to do things like less than or like, which doesn't work terribly well if something is encrypted. And so we ended up writing this massive hack using the PG crypto extension and we would walk the entire ARL AST, look for any binary nodes where the left side was an ARL attribute and replace it with encrypting or decrypting it. And it was some of the dirtiest code that I've ever written. Anyway, right around all this time, this guy gave a talk at RailsConf. I just feel like that's a picture that needs a, this guy. Ernie Miller was giving a talk about some of the funkier parts of the active record internals. And one of the things that he was mentioning was that it would be really nice if when active record defined the accessor methods to match your database schema if it was just calling some public API for you automatically. And it agreed, it sounded a lot like what I had been looking to do for quite some time and I really agreed with his sentiment on how it should work under the hood. So then we fast forward eight months and I went and basically got into Rails to start adding this feature and vastly underestimated the amount of work that I was going to be doing on it. We had a working implementation of the API pretty quickly, but the thing that bothered me about it was at the time, in Rails 4.1, typecasting happens by grabbing the column object associated with that field and calling a typecast method. And types in 4.1 are basically just represented as a symbol. When we're loading from the database, we look at the SQL string that represents the type in the database and we create a simplified type from that, which is represented as a symbol. It would have a case statement on the symbol and then it would choose what behavior to have based on that. And so the initial implementation got rid of the case statement, replaced it with some objects that we could inject, but ultimately the way this worked was typecasting still went through columns in 4.2 or in the earliest implementations of it. And when you called the attributes API at that point, we would actually create a new column object and stick that in the column's hash and would basically lie. And this especially bothered me if it was being used for something that wasn't backed by a database field because there's not even a column involved there. And so there was a lot of conflated concerns about what a column versus an attribute was. So getting the initial API was actually pretty simple or fast at least, but then there was another eight months of work to get to an implementation that I was really happy with and it required rewriting just about every part of ActiveRecord with the exception of association code was touched by this change in some way. But now we have finally gotten to a point where it's a very clean and simple implementation. This is what the final API looks like. You call the class macro attribute, you give it the name of the attribute, and then you give it a type object. And I like to give examples where we're passing an explicit type object, especially one with constructor arguments, because this was one thing that I really wanted to go for with what I like to jokingly refer to as my overly engineered, extremely complicated replacement for adder accessor. But I wanted to work with objects here because the semantics of how you do things like dependency injection are very clear when you're just passing us an object instead of having a magic DSL with symbols and registries. And this is a very universal API. So you cannot, one of the things I tried to do when restructuring the code was we still need to get type information from a column at some point.  But we still at some point need to get the type information from the column, which is kind of sort of how it worked in 4.1. And so I really wanted to make sure that the code was engineered in such a way that other people getting into the code base wouldn't mistakenly use the column object in that way, and that there was only one way to get type information. And so that's why one of the big things, one of the big benefits of the attributes API over just defining a reader and writer is that it works with methods like where. If you have a price column and you're representing it as a money object, you'll probably want to be able to do where price colon and then pass it your money object. And this is what the schema inference look code looks like. It's exactly as we were describing it, we just loop through all of our columns and then we just call public API for you. Define attribute is also public API. It's a little different than attribute in that it's strict, whereas attribute is lazy because it waits until columns have been, until we've done this code so that you can override what the database said if you ask us to. Anyway, so the reason the feature took so long was because I didn't want to ship it when I was unhappy with the implementation. And in particular, the fact that we were modifying the column objects was technically visible through public API. And I didn't want to commit to that. But now we're in Rails 5 and this will finally be a feature that's been available. But it was what got me into open source and why I decided that we needed another full timer on Rails. So it's got a special place in my heart. Anyway, I've talked a lot about this in the past and I don't want to spend too much time on it. So let's move on to the single most frequently requested feature since Rails 3. I've been, I'd seen this proposed so many times and it was just, I'm sorry this took so long to get. But I'm really excited about Active Support Left Pad. Finally, we provide you a way to add padding to the left side of a string. And we feel that this feature is so important that we will actually be shipping this as a separate gem independently of Rails. And we're really hoping that we can get everybody in the Ruby ecosystem to depend on this great new feature. Sorry, I don't know, is it too soon? No, but this probably actually is the most requested feature. Active Record Relation, or finally, six years after Relation was introduced, you can add an or expression to your where clause, right? And so with a response like that to this feature, that begs the question, what took so long? Why didn't we just do this in the first place? And there's a number of reasons, but the biggest one is that the API is actually much less obvious than you might imagine. One thing that people often forget when they're dealing with open source projects is that it's extremely difficult to change an API or to remove an API after it's been introduced. We can't just do something that's good enough or that gives the escape hatch right now, unless we're really confident that that is not something that we'll get in the way later. So we really need to be confident that was the right solution. This is the API we shipped. It takes a relation, it's a method on relation and it takes another relation as the argument. And so this is sort of the intended use case. If we have two namescopes, one's called recent and one is called pinned, and we want anything that is recent or pinned to be on the front page of our blog, then you would create another scope and you do recent.or pinned. And this is sort of the key to why we did this specific design is that we wanted to allow you to reuse namescopes. If something appears as half of an or, it is likely to be used as independently of the or. And so we really wanted to optimize for namescopes. Or more importantly, we wanted to optimize for composition and abstraction. We wanted to give you a tool that let you write code that was easy to reuse and easy to change. And namescopes are how we encapsulate queries.  This was probably the most common one that we saw, where it was just or and it took a hash and it paves exactly like where. There's a couple of big problems with this though. The first one is that or doesn't imply where at all. That's not even the only place in SQL it can appear or can appear inside of your having clause. Since relation sort of exists in the realm of set theory, it would also be entirely reasonable to think that or meant a union query. So some people that the next most common proposal solved that problem by having it be dot where dot or, we have dot where dot not. Sure, and this disambiguated it at the very least. But it didn't solve our goals for the API. You wouldn't be able to easily reuse scopes here. So there's some drawbacks to what we landed on. Specifically if you're outside of a namescope, if you're just sort of constructing your or ad hoc in a controller, it's a little bit more verbose because you have to repeat the class name. So it might look something like this. That's even worse if you're not using a namescope. If you're just doing a really one-off thing and you're calling where, this gets a little bit funky. But at the end of the day, what we're encouraging is for you to not have these ad hoc one-off queries. We're encouraging people to move things into scopes to give them a name, to put them somewhere where the code can be reused and thought about. And I'm okay with that trade-off. So now let's talk about something completely different. Show of hands, how many of you do this? Set your database URL to your production data and then drop the database. Anyone? Anyone? No? Come on, it happens all the time, right? No, but it actually does happen all the time. This is a very common mistake that I've seen many reports of. I do know some people in this room have done it. I have as well. So basically usually the way it happens is they will have used a tool to pull all of the environment variables down from their production server to kind of get their environment set up. And if they're on something like Heroku, that likely includes database URL. And if they forgot to un-set it and then they run their test suite and you're using CappyBara with a server that runs in another thread. So you use database cleaner to delete everything at the end of each test. Then, well, you just got rid of your production database. So we decided that maybe it was time that, like this was happening frequently enough that we decided it was time to do something about it. So this was the first thought. Let's just remove database URL. We run database.yaml through ERB. So if you wanted to use database URL for production, you can just do that and specify that that's how you want to configure it. But when I say that, what I'm actually saying is let's break Heroku and their entire workflow. So Richard Schneemann actually was the champion of this feature. He got everybody together and we had a little meeting to try and think of alternate solutions to this. He put a lot of time and effort into fixing this particular problem in a way that didn't affect. It's not just Heroku, but anything that wants to be kind of container-based infrastructure, just sort of work out of the box. What we ended up doing is a little bit more complex. So what we have now is in addition to schema migrations, which is a table we create for you automatically. We now have a general purpose metadata table. It just has two columns, key and value. And right now the only entry you'll find in there is the name of the environment that the last action was run against. So you will probably not ever see this. When you upgrade to Rails 5, if you try and do something with your database before running a migration, but something that could be destructive, you'll get an error saying, hey, we actually don't know what this database is, just run this one command and then we'll know in theory, if the very first thing you do after upgrading to Rails 5 is something that would have dropped your production database, you might still get hit in some strange way. But basically when we run migrations, we keep track of what environment we know that we're in. And if you ever try and do something that could destroy the database and the environment variable doesn't match up, then we error out. And there's an enable footgun equals one environment variable you can set to overwrite if you really need to. This is the message you'll see if you see this at all. But hopefully you'll never notice this feature. This is just one of those minor things. If we've done our job right, you won't be aware that this exists until you accidentally try and drop your production database. But Rails is now silently protecting you from a surprisingly common mistake. And it's one that's really catastrophic if it happens and you're not prepared for it. So I think this is actually one of the biggest features of Rails 5. And thank you very much, Richard. I don't know if you're in here, but thank you for working on it. So now let's move on to, again, something completely different. Let's talk about migrations. So here's a question that isn't terribly asked terribly often. You can still run your migrations some two years ago, right? I think we tried having a new developer come on and not running DB setup, but actually just running all of the migrations. Notice how schema.rb changes when that happens. So this has been a problem for a while. Migrations are code that sticks around and doesn't change. And it's not code that you test. And it's not code that you're gonna see if a new version of Rails has made a breaking change. You're unlikely to ever see that breakage. And we're seeing more and more users where when we develop for most product companies, we have development and production. And there's exactly one production and end development environments. And when you write a migration, it's run in production very shortly after the code was written. But we're seeing more and more use cases where that's not the case. Something like discourse or manage IQ are both places where the Rails app is a product that's meant to be deployed independently. They actually have a larger number of production environments, an unknown number, and they don't directly control them. And it's entirely possible, much more feasible there that even aside from the two-year-old migration problem, if discourse has an update where they add a migration and then they release that version of discourse and then they have another version of discourse and as part of that they're upgrading to Rails 5, it's entirely possible that the person upgrading to the latest version just skipped a version of discourse and is now running the migration that was written for 4.2 against Rails 5. And so if we change those APIs ever, we can cause breakage. But the thing is, we actually want to make changes. Things have changed a lot of it. We've added things like foreign key support. We've improved the types of indexes that we can create. But we can't actually, for example, create a foreign key by default because that is different than what was happening when you ran that migration against an older version of Rails. So we generate new migrations with foreign key true. Belongs to are now required by default, but we can't actually change the references method in the Migrations API, so we generate null false there. And it just adds up and migrations have just a lot more options there when you create them. And those are some of the more visible visual examples, but there are some more, there's some deeper changes that we would eventually like to make to the structure of the Migrations API that we just definitely couldn't do because they would be not just subtle changes in behavior, but really breaking. So when you generate a migration in Rails 5 now, this is what you'll see. We have square brackets after the class and it will be the version of Rails that you generated it against. And if that's not there, we'll assume four or two, there's really not much we can do for migrations older than four or two. But basically you can be assured that the migrations you have in your application today, as long as you're not referencing your models or any code that elsewhere in your app that changes, which some people do and is usually not a good idea. But as long as you're just writing your migrations through the Migrations API, the migrations that exist in your app today will continue to work exactly as they do until the end of time. And that means that this feature isn't free because we are now dedicated to maintain every version of the Migrations API in our code base until the end of time. That means that at fixing bugs is gonna be harder. We'll have to think about how this affects older versions of the Migrations API if it affects them at all. We will have to change our test suite to run more and more and more versions of the Migrations. And a larger surface area does mean more bugs. One of the things that people forget is that open source maintainers aren't magic. We don't have an infinite amount of time. We don't magically produce code that is free of bugs. So the more complex a feature or API that we add is, the more prone it's going to be to two bugs. But I do think that this is the case where this does have a large maintenance burden. We might in the future decide that we're going to only support migrations up to a certain number of versions back and at that point we'll probably give commands to help squash all of the migrations and migrate them to the new API. But for now the plan is we're gonna just maintain every version of the Migrations API until the end of time. Which does mean that we're still going to be pretty rigorous about whether or not we think a breaking change to the Migrations API is worth it just because it does still add to that maintenance burden. But there's a lot of use cases where this is actually a really important feature that there's just no way to work around. So I think it's worth the trade off. So we've got an interesting little method in ActiveRecord now that most people probably haven't seen in many blog posts. So AccessedFields tells you all of the fields on an ActiveRecord object that were accessed. I think it's well named. So that works. You create a new user model and AccessedFields will turn an empty array because you've accessed nothing assuming you're not doing anything in callbacks. And then if you call dot name, AccessedFields returns a symbol name. So you might be asking, why? So one of the patterns I've noticed is that we never call select unless we're doing some weird calculation. If we're rendering a view and it only ever shows a list of the user's names, we still select all however many columns and not a table like user that could approach 100. And there is a performance cost there. And one of the big reasons is that people, I've heard people say like, I don't want to have to go look at my views and figure out what fields I'm accessing and have to maintain that. So I figured all right, let's figure out if we can try and make this easier. So the workflow I'm sort of envisioning here is you, at the end of your controller action call AccessedFields. Take that array, copy paste it into select, bam, you're selecting less data. If you need to change your view, we'd give you an exception if you're trying to access a field that you didn't select. And so if you change your view and you get this exception all of a sudden, you delete the call to select, add the call to AccessedFields back, and you do it over again. And you don't really have to ever maintain it, we can just sort of tell you. At the time I was sort of envisioning a bullet like gem that you could run in the background and whenever you loaded active record models would give you a warning if you were using say less than 50% of the fields that you selected because that's an indication that you might actually have serious performance benefit. But I forgot about that until the last time I gave this talk, so it hasn't been done yet. But, it's actually, part of the reason I did this was because it's an experiment, but it was really, really trivial to implement. As part of the refactoring that wins the Atree's API, this is sort of where typecasting happens. And we just assigned an instance variable with the result of casting it. And so I can then say if something's been accessed, because I just look to see if the instance variable's defined. So I don't know, I think it's a neat little feature. I was really pleased. The fact that it was so easy to implement made me feel much better about the architecture we ended up with in active record after the typecasting changes. So let's look to a little less data. Now it's a little easier to do. So let's talk about Booleans. Everybody's favorite data type. So I've got a question for you guys. Somebody in the front said false. No, I know it's nobody's favorite data type. I like it, they're simple, there's two values. They're so easy to handle. So let's take a look at this code. We have a Boolean field and we have a regex. And we're going to assign the result of whether or not this regex matches the string to the Boolean field. In this case, it's very clear that the string will match the regex. What do you think the value of the field's gonna be? No, this returns a match data. Anyway, I know a lot of you are probably thinking false is why would I be asking if the answer wasn't false? So a friend of mine from Albuquerque, his name is Jeff Petrie, this is what he looks like. He actually sent me this question. And the code actually looked like this. He was using the swiggly operator instead of the match data operator. And the reason I switched to the match data is because this one has a different caveat that I'll get to in a minute. But basically the problem is in four, two, and more specifically in four, one, the way the Boolean type works is we have this constant and it has all of the true values and it includes the string T, which is what we're gonna, or the string one rather, which is what we're gonna get from the form builder. One, because why have string one and not integer one. The string T, I'm assuming because that's what Postgres has and at some point that went through untouched, but that hasn't been true for a while. The string on, which works in SQLite and I think Oracle and a bunch of others. And then everything that's not in this array is assumed to be false. And the problem is, so dot matches returns a match data object. Match data object, not in the array of true values, so it's false. The squiggly operator here returns the index of the character that matched the regex. And so interestingly enough, if the second character in the string happened to be the one that matched, then this would return one and it would be true. But every other value is false. And so we actually, we were looking through this. How on earth do we just get Boolean yes or no? Does this regex match? Turns out this is the answer. Triple equals is the only method on regex or string that gives it as a Boolean. So this is actually the full list of the values which were truthy in Rails 4.1 and earlier. That's not how Ruby works. We don't have the known set of true and everything else is false. That's awful, right? How we're working now is not how it works either, but we're closer. So in Ruby, nil is falsey. False is falsey. Everything else is truthy. So we flipped it around. These are now the values which are falsey. Ironically, this doesn't actually quite fix that original squiggly operator problem because if the first character of the string matches, it's gonna return zero and zero's on that list. So there's still a catch in there, but yeah. Anyway, I've been saying 4.1 because you would have gotten a deprecation warning in 4.2 if you were affected by this. So don't, I'm sure somebody's panicking like, oh my God, we're assigning regex matches to the admin field of our user model and now everybody's gonna be an admin. No, if you had an ambiguous value in 4.2, you would have gotten a deprecation warning. So this is another one where it's minor, you will probably never notice it and hopefully now you will definitely never notice it because if you noticed the behavior before, it was because it was doing something really confusing and really wrong and I'm glad we're not doing that anymore. Anyway, those are the stories that I was hoping to share with you guys. I would like to, while I have a captive audience, pitch my new ORM written in Rust. It's called Diesel. I have stickers, if you'd like stickers, come find me afterwards. This is our website. Big thank you to Shopify. They sponsor me to work on open source full time and they pay for me to come to all of the conferences and speak to all of you. If you'd like to work with Raphael and I, who both work at Shopify, please let us know. Thank you very much. I will now take questions. Yes, the question was if you can chain dot ORS. You can chain dot ORS and you can combine it with, and is still just dot where, dot where, dot where. You can chain them. The precedence will be basically exactly what you've passed to us. The question was has there been talk about adding an explicit dot and to mirror dot OR? No, I'm not sure that that is something that should be added, but that is an interesting thought. And I would need to just look at how it affects the rest of the API. But no, there has not been an explicit discussion about it. Is there a specific reason NIL wasn't a falsely valued? Yes, NIL is null. And if your column is not null, then NIL will still try to get inserted as null and so it'll blow up. The question was is there a plan to put accessed fields on relation? No, because like the implementation would just be if the first element, it would be calling on the first element and I can't really know if you're gonna use every model in the collection the same way and it's just very easy for you to do dot first, dot access fields if that's what you need. The question was what is the metadata table I mentioned called and how do you prepare if you are worried that it might collide? I don't remember the exact name but I believe it is double underscore, active record underscore metadata so I think it's pretty unlikely that you will be colliding with it. If you do have that, I'm interested how you got like the model name to match up with that because yeah. So I don't expect that it'll collide with anything but that was a concern that was brought up and that's why we have the double underscore in front of it. So the question was a common practice is to pull down the production database locally and how does that interact with our protection against destructive actions? So tools that are meant to be used with Rails for that sort of thing should be should just update to exclude the metadata table that similarly to how I would imagine I guess they would include schema migrations. Basically what will happen is you will get that error message. I'll say we think that this is production and you're trying to run this in development. Please run this command to update if you're seeing this in error. So you would just need to run that after you fold that down. The question was dropping the metadata table would also get rid of that error. Yes, as long as you run a migration before you try and do something destructive otherwise you would get the same error because we don't know. The question is how square brackets on migrations implemented? We just implement the square brackets method on the class object itself and then we return a new anonymous class. It works very similarly to if you use if you use any gems that have like include there is a gem that implements the comparable methods for you which I don't remember the name of it but equalizer and the way it works is you do include equalizer not new foobarb as and it just works very similarly to that. We just generate a new anonymous class. The question was do I have any ideas for Rails 6 and things that are going to require major differences and I'm assuming specifically mean differences in the connection adapter. Yeah, the main thing I want to do is get the third party connection adapters onto public API so that way there is more stability. Unfortunately that change will have to be a breaking change but I'm hoping to basically re-implement a lot of the connection adapters to be on top of an API that we think can be more stable in the long term and then work with the third party adapters to get that over. The only other thing that I'm specifically thinking of for Rails 6 right now is moving the attributes API up to active model which will involve some breaking changes with things like dirty checking will need to go through the attributes API and wouldn't just work with regular Adder Accessor which I don't think will be a huge impact but I need to explore it a little bit more. All right, well thank you very much everybody. I will still be around if you have questions.


Thank you, everyone. Thank you. Yeah, I'm under pressure Because I'm more of a doer than a talker. So if I fumble, please Clap for me Yeah, so first a very warm welcome to everybody in this whole product festival, right? And all our online audiences I want to first start by thanking product school For making this happen and for the audience coming here and allowing me to share my experiences with you As I said, I'm a doer.  Data No pun intended And This is how I look like on LinkedIn lot have been talked about me. Let's move on from there. I want to Talk about some of my fundamental beliefs, which you won't find on LinkedIn, right? This is been the start of the journey basically moving from a jack-of-all-trades to a master of all all things product management Steve Jobs He's my hero What I like about him is his clarity is His vision sometimes stubborn vision if you may think But that stubbornness Comes from a extreme deep understanding of the customer right Think of it deeply all things product management are equally important for us But who doesn't need data who doesn't need hiring who doesn't need culture, right? But what segregates a product leader? From the rest of the herd is customer obsession. I Never forget that. So I do spend 80% of my time Just trying to understand customer and never sell anything to the customer, right? And that's what I'm going to talk about So when this First opportunity came to me. I thought I'll have to make a dent in the universe, right sounds familiar So I thought that why not? Talk about the pressures of prioritization all the stakeholder disagreements and all the scope changes, right? How many of you can relate to this problem quick quick show of hands, right? Super so that's a testimony that frameworks don't work, right? so and the reason is that product and And payroll is every employee's business Like it or not. Everybody has an opinion about it, right? So the sooner we get to terms with it the better it is So what I did was in my quest for excellence. I also tried chat GPT So how do I say no confidently? It says be assertive And if I'm assertive, you know what follows, right? So I want to share with you how we solve this problem in tier I want to first introduce tier mobility to all of you if you haven't already used our products Yeah, you already saw our MJ using our scooters. So we are a sustainability company We are the mission to change mobility for good We are in 31 countries Let me read it out from the slide So we are in 31 countries 560 cities 24 plus million customers in four years How does this infectious growth happen, right? So this is product led growth in reality, right? So I'm going to share with you some of the Mechanisms that we use beyond any frameworks which don't work, right? To enable such infectious growth and it starts with it starts with product like growth. It starts with the odd design So as a product leader, I am responsible accountable and so is my team Responsible and accountable for the PNL performance of the company pressure right, but then we Participate in the forecasting in the budgeting. We take the lead not finance Right, and we are held accountable for the performance of the company. So we have to go beyond slides We have to go beyond talking about it into practical execution and that's what I'm going to share with you, right? About what are the working mechanisms that we have put in place that can build such a growth and it's always about saying no It's always about saying no saying no to the thousand things so that we focus on the right things, right? And by the way, I'm a doer if you like it. So please little round of applause will help me So it all begins with him right 1997 still so valid says they're only simple things Focus and simplicity. That's what we do in Q4, right? So we begin with who? Is our customer and who is not and why do they care? then We move to simplicity what to simplify where and when to simplify and Don't forget the The people right because as product leaders we need to bring all our folks All our stakeholders including our vendors on the same journey, right? If there is no alignment, then we have a problem So I'll begin with the Q4 exercise that I was talking about right is we focus on who is our customer and who is not right sometimes people will say begin with the why I say begin with the who right and Focus can be scary It can be really scary ask me when I go for a buffet dinner I make sure I pick up everything on my way and What happens I end up eating a lot of things I don't like Right, and I end up wasting a lot of food. So if you ask me at the end of the day, was it pleasurable? Probably not then I wish that what was value for money I wish that I would have known exactly those three delicious items that I like I would have picked them up in abundance ate them and yet have time for some chocolate desert That's the power of focus for you and That's why I always say that you have to focus on your Pareto customers those 20% customers who will unlock 80% of your growth ambitions Whatever your growth ambition is it could be profitability. It could be revenue. It could be Moving to a new region adding a new product line. Whatever is your strategic growth ambition of the company the corporate strategy? Align yourself to that bring in those 20% of users power users Who are going to unlock that 80% of value identify them and then? Do deep interviews with them? One hour at least deep interviews with them never sell solutions Try and understand where they are coming from what they do before what they do after a lot has been talked about I won't bore you with those details, right? But it's important as product leaders I personally also go through each and every question. That's there, right? And Alongside that that's a qualitative analysis do a quantitative analysis AI cluster analysis so on and so forth to understand the In our behaviors of the customers and get to the point of what they don't tell you, right? So with that knowledge then we move in Q4 itself to what is known as a strategy canvas So here we have all the values or all the needs all the problems whatever you call it that the customers or Those segments of those target segments really want on a scale of zero to ten We picked two and I'll show you why This is on top of this we overlay where our strengths are important and we find out that In certain areas, we are actually fulfilling the need to an optimum five areas Now email and we then specifically choose not to build or develop new products in this area or new Experiences right and I know some of you are going like what about wow? What about delight? Right, how do I build in delight? Why not build that 5x growth? Well, let me quote an example and I'll read from here iPhone 14 Pro Max and Samsung S22 I'm going to compare these two we know who the market leader is I'm not going to break that debate on Apple versus Samsung right but iPhone has 14 megapixels of front camera and 18 in the back in the rear versus Samsung is 108 so three times more feature packed yet as a customer I bet you would say which is the winner and you know which provides a pleasurable experience So one of the things that I'm really passionate about is that if the need is basic Right, if it's just a basic need jobs to be done Then there comes a point of diminishing return as a product leader. We need to know that point Don't keep on wowing the customer everywhere if you want to please everybody please no one, right? So that's one tip for you moving on We have the competition Now this is a massive generalization don't don't get to to to work up with it It's a massive generalization in reality We plot all our competitions different each in individual competition and plot their strength take this as an aggregation, right? And we then see what is the strength of the competition and where I should not pick up battles and there I find two areas Now You may ask Okay, why still not fight them in these two areas? Why do you bail out? The reason could be multiple The reason could be that I may not be able to drive a lot of Huge customer experience. I may only be able to drive marginal customer experience, right? So I know that or it could be that we know that the competition will make a move, right? So based on those things we decide We will not there are other use cases also for example That you know that technology may be very hard technology to move this Problem is in its infancy So we know that we will have to come up with hacks and a lot of work has to be done. So that could be another reason Two other points. I want to touch on is it may not be our strength also, right? and we need to play to our strengths and Last this need may be a general need for all segments. It's not unique to my VIP segment or my strategic customer So that's something those are some of the reasons why we decide not to fight that battle then Comes where do we pick up the battle? So we selected two areas, right and why? So the first is need number six We we selected this because this need is just not a very practical need it is in The hierarchy of needs it is at a self-actuation or much higher need higher need emotional needs Customer willingness to pay is much more if you keep chasing the practical needs mega pixel You will keep doing that, right? But the emotional need that apple cracked was that you don't want to click a picture You will upload a picture in Instagram. Oh, so after a certain point It's diminishing return because it takes a lot of time. It's a heavy file Right. So those are the things you need to really get into. So that's the need number six then the need number ten We picked this because It's a unique need to my strategic customer the non-strategic segment may not have this need may not appeal to them And why that's important because if I have to bottle my strategic customer, right? Then I need to understand what differentiates them and what is the additional things beyond the practical things Everybody's looking for and that's why we select here, right? and another thing as a tip that I always kind of do then is how do we incentivize The non-strategic segment to behave According to these needs. So we always incentivize customers who want to behave in this way, right? So you do this I give you this in that we are actually moving the needle of the non-strategic segment to move into the strategic space And I am creating a broader group of strategic customers that will give me high CLTV, right? So these are some of the reasons why we Do this once so basically don't keep adding values periodically here and there doesn't make sense, right? add 5x value in very focused areas where you will be able to compete and That is competitive advantage. So we know that we are at least 5x times better than our competition in these two areas And that is my product positioning, right? Next it comes with we need to align Strategic alignment, I feel you Why not stakeholder engagement? Why I choose strategic alignment? It's because ask a married couple They'll tell you Sometimes it's too much engagement less alignment. So what if What if you agree with your stakeholders on first principles Before the year starts that these are the building blocks. These are the principles any day daily transaction happens daily decision making I always refer back to that contract. Hey, I married you last year and this was my contract and one of those is as a we in the Q4 itself all that I said we Discuss and align on the segment. We will not target segment we will target on The product positioning as I mentioned which are the clear areas. We'll hit the ball out of the park and Then we open up something known as a product intake mechanism. So when Every stakeholder including finance anybody has an idea. There's a clear ticket raise it and it will come to my backlog and we'll analyze Here Again Should not do this in presentation. I'm told don't go back. Okay So again, I'm a doer right I can get away with things so In product intake mechanism a few things. I always encourage my stakeholder Please don't give me solution. Tell me the problems. You're wanting to solve for the customers, right? otherwise, it's not a customer obsessed company, it's a sales company and One from my experience You will see that through this process you're able to actually filter out 80 to 90 percent of The ideas that come in right because they don't fit into your strategic decision-making, right? Remember those 80 years that we chose not to build, right? So that's where you can cut down on 80 to 90 percent. That's enough saying no very nicely Okay Now with that intake mechanism. What do we still do in Q4? It's a long Q4, right? Is we plot all those ideas that we internally have and that has come from stakeholders into this product impact canvas now Arguably you would say that if there is no development work happening or no enhancement of the UX then Still the the product would sell right as long as you keep your services on and you know KTLO stuff keep the lights on right So that's our baseline that's what we call in the forecasting process as our baseline Anything we build on top of that should have clear revenue targets and goals Right, so you'd see the first one here Okay Is team cool? right, they have been assigned the problem ABC right and The target is 5% of acquisition so we believe that if we do ABC we will acquire 5% of more customers this is based on historic data gut feeling whatever you call and This will give me a total uplift now that I explained baseline and uplift of 3.8 million will be rich someday and This is a strategic area Right, so it's important for us to build it and it'll give me EBITDA etc Then I move on to the second one which is same cool team, but doing XYZ and You would ask me here Why are they working on a non strategic area? You just said you will not work But think of things like chat GPT When a disruptive technology comes and throws the you know throws you off the rail in five days Right, that means or when the entire competition has upped the game Right, that means then if you go back to the value curve or the strategic curve the customer expression Expectation would have increased Right, and that is when we also decide to work on non strategic areas Yeah, so that's q4 pressure after that What we do on a monthly basis or a daily or a weekly basis is rapid experimentation Remember, I assumed 5% based on similar projects etc etc and that's an assumption But if we achieve 5% of acquisition Definitely because we do the forecasting based on our finance model, right? So finance can assure you if 5% is guaranteed 3.8 million is guaranteed, right? So question is is it five or is it two rapid experimentation bring it make it as hacky as possible But business is speed timing is everything, right? Do visit of ours do prototype as far as I am concerned drawn a piece of paper and experiment, right? But shouldn't take more time. That's important. That's why and Then if you revise your assumption that will be revised here, correct Next the product intake mechanism is always there So new ideas are always flowing in 80% of them are automatically segregated out because of first principles, right? and Then we align the stakeholder consistently. This is where we do the monthly business reviews, right? So that we update the impact canvas and do the business reviews constantly with the stakeholder Two things I want to add here, which previous speakers have fantastically covered. So I won't be elaborate on it one is Continuous discovery So remember we did the whole exercise of customer understanding in Q4 not that I don't revisit it again, right? As I said, I like to spend most of my time with the customer So we revisit that every time to understand whether the needs are changing, correct? Or you know all of that and then We definitely need to adapt this one and this is the moment where I fumble, right? So I was expecting a clap That's it. Thank you back on track. So When there is this constant alignment with the customer and I want to I want to kind of Explain it with a metaphor, right? So customer relationship is is like somewhat Like a partnership. Yeah, or I can say it's like my relationship with my spouse. It's that deep So in the initial honeymoon period, there's a lot of curiosity and a lot of understanding Right, but the curiosity drains down because what's more to understand? I know everything and then the miss is in front of the understanding right if We know that as leaders consciously and it has happened people take an example of Nokia taking customers for granted We are the best overnight gone, right? If we know that constantly we would be as curious and I think Pardon me 20 or 23 years You know, I think we have a very good relationship with my wife. So So that's important if stickiness is retention Then curiosity is the glue Right your PM's curiosity is definitely the glue. So please don't forget that quick recap Besides the tip of wearing red glasses. It's always is nice to say no red Okay resonated with somebody These are your first. This is a quick recap of the top five, right? So we first do a who who is my customer most importantly who is not Right, whenever somebody says I want to do this. That's okay. What do we not do? Right, so who is my customer who is not segment target then why? why There are so many why is that the customer cares about what is my product positioning third intake process Bring in everything as I said 80% will not fit your strategic area. So you have clear goals Those 20% that remain rapidly experiment be curious align stakeholders and you will nail it and I want to end by saying thank you to two group of people without with whom I would not have been able to utter a single word here one Product school guys back in there's a lot of work a lot of hard work. Yeah, I think we should appreciate that Not done yet my team if they did not deliver on The metrics that I was able to proudly show to you. I would not have able to be even stand here, right? So, please around over And oh, I'll finish with the Steve jobs. Okay. No, I'll finish with Steve jobs That was awkward that was awkward. No, no, no, it's not awkward I'm a doer. They've given me the license. Are we should I go back down? No, it's okay 30 seconds. So All right, it's important to say I'll point for you. I'll point. Yep. It's important to say that what he said is I'm proud of all the things that I haven't done, right and Innovation innovation is saying no to thousand things. I'll end with focus is about saying no. Thank you


Hello there my beautiful lovely internet friends. I have been keeping this leg downstairs. I'm not using it right now. She's been sitting here for weeks. I just picked it up to film this video and do some demonstration and I looked inside. You ready for this? Shepherd problems. I have two dogs that are obsessed with tennis balls and apparently they lost one in my leg. Weird sons.